C++对象模型 第五章 构造、析构、拷贝语意学

第五章  构造、析构、拷贝语意学


1)构造析构的顺序
例:class A{
public:
A(int a=0):_a(a){cout<<"A::constructor"<<endl;}
~A(){cout<<"A::destructor"<<endl;}
private:
int _a;
};
class C{
public:
C(int c=0):_c(c){cout<<"C::constructor"<<endl;}
~C(){cout<<"C::destructor"<<endl;}
private:
int _c;
};
class B:public A{
public:
B(int b=0):_b(b){cout<<"B::constructor"<<endl;}
~B(){cout<<"B::destructor"<<endl;}
private:
int _b;
C cc;
};
运行的结果:
A::constructor
C::constructor
B::constructor


B::destructor
C::destructor
A::destructor
请按任意键继续. . .
可以看出声明一个有继承链的类的对象,它的构造函数的调用顺序:
 ①基类的构造函数②内含的类对象③初始化列表,然后才是构造函数体


1)一个类的初始化列表只能初始化它的类data member和base class


2)c++不允许取一个构造函数或析构函数的地址。


3)一个纯虚函数只能被静态的调用(类似调用静态函数)如Base::interface(),它不能经由虚拟机制调用。一般而言,纯虚函数可以只声明不定义,但有一种情况除外,就是pure virtual destructor


4)观念上,类的trivial constructor 和destructor都会被产生并被调用,实际上trivial的构造和析构函数不会被产生出来。


5)和c不同,c++的所有全局对象都被以“初始化过的数据”来对待


6)delete 一个类对象,会触发该类的析构函数,但是该析构函数不一定会被执行,有可能是trivial的(不是没被产生就是没被调用)


7)explicit initialization  list 带来的三项缺点
①只有当class member  是public,此法才奏效、、、、????
②只能指定常量
③由于编译器没有自动实行,失败的可能性会高一些


那么explicit initialization list 所带来的效率优点,能够补偿其软件工程上的缺点嘛?一般而言,no.




8)一般都会显示提供拷贝构造函数,以支持NRV的优化,在拷贝构造中,最好加入防止自我拷贝的代码:if(this==&rhs) return *this;


9)在虚拟继承中,如何要保证虚基类的构造函数只被调用一次呢,可以在构造函数的形式参数中,加入bool型的参数,标记虚基类的构造函数是否被调用过,若被调用过,则不能再被调用。


10)对一个非完整的对象,进行静态决议,如何才能静态决议呢,就是限制一组virtual  functions候选名单。这就有关vptr的初始化,那么vptr什么时候初始化呢,答案是在base class constructors 调用操作之后,但在程序员供应的代码或是member initialization list中所列members初始化操作之前。
这样在调用base class constructors的过程中,并没有初始化vptr,从而抑制了virtual functions。


constructor的执行算法通常过程如下:
①在derived class constructor中,所有的virtual base class 以及 上一层base class的constructors会被调用
②上述完成之后,对象的vptr会被初始化‘
③如果有member initialization list的话,将在constructor体内展开。
④最后执行程序员代码




vptr在下列两种情况下被设定:
①当一个完整的对象被构造起来的时候
②当一个subobject constructor调用一个virtual  function的时候。




11)如何显示地拒绝一个class object指定给另一个class object呢?只要将copy assignment operator声明为private。


12)一个class对于默认的copy  assignment operator,在一下情况,不会表现出bitwise copy 语意:
①当class内含一个class member ,而该对象有一个copy assignment operator
②当一个class的base class 有一个copy assignment operator时
③当一个class声明了virtual function时(一定不能bitwise copy  如 point p= point3d_p;)
④当class 继承自一个虚基类(不论此base class有没有copy operator)
c++ standard上说 copy assignment operators并不表示bitwise copy semantics是trivial


12)和拷贝构造函数和析构函数不同的是 取copy assignment operator地址是合法操作


13)如果class没有定义destructor,那么只有在class内含的member object(亦或是class自己的base class或有基类(virtual or not))拥有destructor的情况下,编译器才会自动合成一个来,否则,destructor被视为不需要。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值