C++ default constructor 讨论

豆瓣是个好地方,可以找到很多好书,最近翻到了Lippmaninside the c++ object model,今天看了关于默然构造函数部分,对这个东西有了新的理解,又找出c++ standard对照着看了看。

 

首先看c++ standard 12.1default constructor的定义:

A default constructor for a class X is a constructor of class X that can be called without an argument.

——ISO/IEC 14882:2003(E)

接下来看两个说法:

a)如果class没有定义default constructor,就会被合成一个出来;

b)编译器合成出来的default constructor会明确设定class内每个data member的默认值;

 

编译器在以下四种情况下生成default constructor

a)一个class没有任何constructor,但它内含一个member object,而后者有default constructor,那么这个classimplicit default constructor就是nontrivial。注意:编译器的合成工作只有在constructor真正需要被调用时才发生;

b)一个class没有任何constructor,但它派生自一个带有default constructor的的base class,那么此derived classdefault constructor会被视为nontrivial。注意:如果设计者提供的若干constructor中没有default constructor,编译器会将多余代码加入到这些constructor中,而不会去生成default constructor

c)一个class声明或者继承了virtual function。注意:一个含有virtual functionclass在编译期间有两个动作:一是生成一个virtual function table(vtbl),放置virtual function地址;二是class object中生成virtual pointer(vptr),指向vtbl。同第二条,编译器会往用户自己设计的constructor中添加内容,初始化vptr,或者自己生成default constructor

d)一个class带有至少一个virtual base class。虽然编译器的设计不太一样,但在程序运行之前,必须使每个derived class object知道virtual base class的存取位置。

 

上面是从lippman的书中摘出来的,再看c++ 标准如何从反面说的:

If there is no user-declared constructor for class X, a default constructor is implicitly declared. An implicitly-declared default constructor is an inline public member of its class. A constructor is trivial if it is an implicitly-declared default constructor and if:

— its class has no virtual function and no virtual base classes, and

— all the direct base classes of its class have trivial constructors, and

— for all the nonstatic data members of its class that are of class type (or array thereof), each such class has a trivial constructor.

 

看到这儿,很自然有个问题:什么是trivial constructor,什么是nontrivial constructor

我们暂且称它们为平凡构造函数和非平凡构造函数,其中后者满足前面四种情况之一,会在需要时被创建出来。而前者的情况是说一个class拥有implicit trivial default constructors,实际上并不会被编译器合成出来。同时,在被合成的default constructor中,只有base class subobjects member class objects会被初始化,其它的均不会。

    自然,文章开头的两种说法都是错误的。

 

    看到这儿,我忽然很想知道C++编译器的实现,不是教科书上的理论,而是,现在让你去写一个C++编译器,你怎么写?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值