构造、析构、拷贝

构造、析构、拷贝


首先,虽说当我们不定义构造函数、析构函数的时候,编译器会帮我们生成一个,但是实际上,编译器只会生成nontrival的构造、析构等函数。

在以下情况中为nontrival的

  • 虚继承
  • 虚函数
  • 类成员变量含有构造函数、析构、复制构造、赋值运算
    • 继承的类含有构造、析构、复制构造、赋值运算

纯虚函数


即便类中含有纯虚函数会让类无法创建实例,但假如这样的类中含有数据成员,那么你可能仍然需要定义该类的构造函数。

另外,允许你对纯虚函数进行缺省的定义,即定义纯虚函数,但是这样的函数只能通过静态来调用,而非虚拟机制调用。另外,最好不要把析构函数声明为纯虚函数,因为它的派生类会静态的调用基类的析构函数,如果缺少析构函数的定义,则会导致连接失败。如果你还想定义一个纯虚的析构函数,请给出他的缺省定义。

以及,这样的类中不要有const成员。

构造函数

构造函数的初始化列表有三个缺点

  • 只有当类成员都是public的时候,才有效
  • 初始化列表传入的参数必须使常量,因为他们在编译时期可以被评估
  • 初始化行为的失败可能性会高一些。

一般而言,编译器扩充操作如下

  • 记录初始化列表中数据成员的初始化操作,把他们放在函数体中,按照声明顺序排列。
  • 如果有成员没有放在初始化列表中,但是他有一个默认构造,则该默认构造必须被调用。
  • 在这之前,如果有,为vptr指定初值
  • 在这之前,所有基类的构造函数必须被调用。
  • 在这之前,所有虚基类的构造函数必须被调用

析构函数

析构函数在被需要的时候也会被合成出来,如果基类有虚析构函数,那么编译器生成的析构函数也是virtual的,如果基类析构函数使inline的,那么调用操作会在调用地点被扩展开来。

赋值运算

在虚基类的情况下,赋值运算会导致虚基类被多次赋值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值