c++的构造函数

c++的构造函数:

 

 

c++在什么时候编译器会合成一个默认构造函数呢?

        第一:我们要明确编译器合成的构造函数有两种,第一种是trivial(没有任何用处的),第二种是notrivial(有用的).其实,第一种编译器什么工作也没做,即没合成,只不过换了一种说法,叫做合成trivial construction.第二:编译器在什么情况下会合成默认构造函数呢?(以下全部指notrivial construction)

        合成默认构造函数的前提是程序员没有声明任何构造函数的情况下(如果程序员自定义了构造函数,编译器会向其中安插相应的初始化代码,且安插在用户显示的代码之前).

在以下四种情况,编译器会合成默认构造函数.

1.类成员对象有默认构造函数.

        编译器会合成默认构造函数,并且在构造函数中按类成员对象的声明顺序添加class member construction.

2.基类有默认构造函数.(同上)

3.类中有virtualfunction

        编译器要构造vptr,并指向其vtalbe.

4.类中有virtual baseclass(同上,只不过更复杂)

 

 

编译器在什么情况下合成default copy construction?

       首先要明确一点,编译器在确定不是biwise copysemantics的情况下,才有可能合成default copy construction.什么情况不是biwise copysemantics,就是以下四种情况.

在以下四种情况,编译器会合成default copy construction.

1.类成员对象有default copyconstruction.

        编译器会合成default copy construction,并且在default copy construction中按类对象成员的声明顺序依次调用类对象成员的default copyconstruction,这些操作均在用户显示代码之前.

2.基类有默认构造函数.(同上)

3.类中有virtualfunction

        编译器要构造vptr,并指向正确的vtalbe.

4.类中有virtual baseclass(同上,只不过更复杂)

调用 copy construction的情况:

Aa=temp;

voidfunc(A a);

Afunc (){

returna;

}

定义一个拷贝构造函数

//参数必须是引用,否则递归调用,并且没有终止:

A::A(A&a){

…..

}

 

成员初始化类表

1.成员初始化列表是在显示的用户代码之前调用的.

2.初始化列表中的初始化顺序是按照其类中声明顺序,即编译器会按照声明顺序重新调整初始化列表中成员的顺序.

3.成员初始化列表是对成员进行定义(严谨的c++中把定义视为分配内存的行为)并同时初始化.

4.当程序执行用户显示代码时候,已经完成了所有类成员的初始化.即初始化函数中对成员的'='行为都是赋值行为(调用赋值操作符operator=).

 

有四种情况必须使用成员初始化列表:

1.const member

2.reference member

3.class member construction都有参数.

4.基类的构造函数都有参数.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值