[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 derived
delete b时 如果b的析构函数不是虚函数的话,就只会释放掉base的空间,derived就被无视了,很不好!



0 0
原创粉丝点击