deep_c++:构造函数——1


一般情况下,编译器生成的默认构造函数时不干事的,但是在一下的四种情况,默认的构造函数是要干事的:

1)包含有带构造函数的类成员的类

class A
{
public:
A(int x) : i(x) {};
private:
int i;
};


class B
{
private:
char i;
A a;
};

这种情况下B的默认的构造函数是要干活的。


2)继承自带有构造函数的基类的类

class A
{
public:
A(int x) : i(x) {};
private:
int i;
};




class B : public A
{
private:
int b;
};

3)带有虚函数的类

因为有vptr所以需要初始化

4)带有一个虚基类的类


总结:简单来讲编译器会为构造函数做的一点事就是调用其基类或成员对象的默 认构造函数,以及初始化vprt以及准备虚基类的位置。

总的来说,编译器将对构造函数动这些手脚:

  • 如果类虚继承自基类,编译器将在所有构造函数中插入准备虚基类位置的代 码和提供支持虚基类机制的代码。
  • 如果类声明有虚函数,那么编译器将为之生成虚函数表以存储虚函数地址, 并将虚函数指针(vptr)的初始化代码插入到类的所有构造函数中。
  • 如果类的父类有默认构造函数,编译将会对所有的默认构造函数插入调用其 父类必要的默认构造函数。必要是指设计者没有显示初始化其父类,调用顺 序,依照其继承时声明顺序。
  • 如果类包含带有默认构造函数的对象成员,那么编译器将会为所有的构造函 数插入对这些对象成员的默认构造函数进行必要的调用代码,所谓必要是指 类设计者设计的构造函数没有对对象成员进行显式初始化。成员对象默认构 造函数的调用顺序,依照其声明顺序。
  • 若类没有定义任何构造函数,编译器会为其合成默认构造函数,再执行上述 四点。

【2011/12/21 补】需要说明的是,从概念来上来讲,每一个没有定义构造函数 的类都会由编译器来合成一个默认构造函数,以使得可以定义一个该类的对象, 但是默认构造函数是否真的会被合成,将视是否有需要而定。C++ standard 将 合成的默认构造函数分为 trivial 和 notrivial 两种,前文所述的四种情况对 应于notrivial默认构造函数,其它情况都属于trivial。对于一个trivial默认 构造函数,编译器的态度是,既然它全无用处,干脆就不合成它。在这儿要厘清 的是概念与实现的差别,概念上追求缜密完善,在实现上则追求效率,可以不要 的东西就不要。













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值