c++对象模型笔记之构造函数

构造函数
你是不是这样认为:
(1)任何类如果没有定义默认构造函数,编译器就会合成一个;
(2)编译器合成的会明确社顶类中每个数据成员的默认值;
事实并非如此,只有C++编译器需要的时候才会合成个默认构造函数。
类中带有对象成员
class A{……};
class B
{
 private:
 A a;  //对象成员
 int x;
}
合成的构造函数
B::B( )
{
 a.A::A();
}
假如你定义了个构造函数
A::A( )
{
 x=0;
}
编译器会追加代码到里面去
A::A()
{
 a.A::A();
 x=0;
}
基类中有默认构造函数(包括被合成的)
和第一种一样,你定义了很多构造函数,编译器会追加代码到每个构造函数中
 
带有虚函数的类(包括纯虚函数)
编译器的必要的操作
(1)一个虚函数表将产生,内放虚函数的地址;
(2) 一个虚函数指针将产生,指向虚函数表地址;
所以编译器会为每个对象设定vptr的初始值,放置适当的虚函数表地址,对于类所定义的构造函数追加代码完成这些事。
 
虚继承
class X{publci: int i ; };
class A :public virtual X { public : int j ;};
class B: public virtual X { public: double d;};
class C: public A,public B{ public: int k;};
void foo(const A *pa) { pa->i=1024;}  //无法在编译期决定出pa->X::i 的位置
main() {foo(new A); foo(new C);}  // 可能转变为 void foo (const A*pa) { pa->_vbcx->i=1024} vbcx是对象指向类X的指针,当然要在构造函数中确定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值