[Boolan] C++第三周学习笔记
来源:互联网 发布:centos防火墙关闭端口 编辑:程序博客网 时间:2024/05/19 23:13
1.关于构造函数和析构函数:
在存在继承,组合等情况时,构造函数的顺序总是由内而外(基->子),析构则相反,对于既有组合又有继承时,例如:
class base {public:base() { cout << "base\n"; }};class other {public:other() { cout << "other\n"; }};class derived : public base {public:derived() { cout << "derived\n"; }other o;};int main(){derived d;}输出应该是:
base
other
derived
没查过书,大概是因为可以这么理解构造函数:derived() : o(),/*"成员初始化"*/ { "函数体" }。
因为之前老师说“构造函数是先执行一个初始化的时期,然后再执行函数体,所以成员变量的初始化在c++要放在函数体前面写,虽然结果一样,但是如果写在函数体里,本质上更类似于赋值而不是初始化”。在初始化阶段需要为成员变量声明并分配空间(”声明变量“和”分配空间“目前没有概念,关于这点意见保留),因此other的构造函数肯定先跑完了再运行了derived的构造函数的cout。
2.类的继承:
成员变量是内存上的继承,成员函数是调用权上的继承?
3.静态成员变量:
挺麻烦的,先记下我目前的理解,有错到时候再改
(1)首先类的头文件声明不会分配空间,像这种:
class derived : public base {public:derived() { cout << "derived\n"; }static other o;};如果就这样直接在main里声明一个derived对象,o还是没有被分配空间的,other的构造函数也不会运行
(2)静态成员变量只能在类外部初始化,除非是特例:const static 静态常量成员变量
静态成员变量是优先于任何类的对象存在的,大部分情况下都是在类的实现文件里,main()之前先初始化并分配好空间,因为其生存期也处于整个程序周期。
class derived : public base {public:derived() { cout << "derived\n"; }static other o;};other derived::o;int main(){derived d;}像这样的话,结果就是:
other
base
derived
OK,目前只能这么理解,感觉这方面其实还有坑没填
4.虚函数
虚函数主要是为了多态的实现,但是这也必然会增加开销,因为每个对象要去维护一个虚函数表,貌似要问c++相比c哪些地方会增大机能开销,那么虚函数应该是一个比较明显的地方吧……
构造函数不能是虚函数,析构函数最好是虚函数
(1)因为虚函数的实现需要有空间去存放虚函数表,需要通过对象内的虚函数表指针去调用虚函数,这个没法在构造函数分配空间之前存在,所以构造函数不能是虚函数?
(2)对于这种情况
base *b = new deriveddelete b时 如果b的析构函数不是虚函数的话,就只会释放掉base的空间,derived就被无视了,很不好!
- [Boolan] C++第三周学习笔记
- Boolan* C++课程第三周笔记
- Boolan C++设计模式 第三周笔记
- C++面向对象第三周笔记<Boolan>
- [Boolan] C++第二周学习笔记
- [Boolan] C++第五周学习笔记
- [Boolan] C++第六周学习笔记
- C++ 开发工程师 第三周笔记 boolan.com
- Boolan STL与泛型编程 第三周笔记
- Boolan C++ STL与泛型编程 第三周笔记
- Boolan博览网C++开发课程第三周笔记
- Boolan 第二周笔记
- C++ Type Traits的学习 (Boolan学习笔记第九周)
- [Boolan]第二周学习笔记——rico风
- Boolan IOS第二周笔记
- [Boolan] 这周的笔记
- Boolan C++ 设计模式 第三周
- C++类和类之间的关系(Boolan笔记第三周)
- 167. Two Sum II - Input array is sorted
- 逆向工程核心原理读书笔记-API钩取之记事本小写转大写
- Angular 2 中的组件(一)
- javascript实现-简易计算器
- 小米2S ROM重分区
- [Boolan] C++第三周学习笔记
- c# 解决 EntityFramework 基础提供程序在 Open 上失败
- Activity启动流程笔记(一)
- 初识Java虚拟机(10)动态分派的实现
- 数字基带传输与码间干扰
- 共同学习Java源代码-数据结构-TreeSet(二)
- poj_3254 Corn Fields(状压dp)
- 设计模式总论
- Qt一些宏的用法