C++编程规范(六) 构造、析构和拷贝

 

最有价值条款:51

 

 

47.以同样的顺序定义和初始化成员变量

 

这在Inside object model和effective C++里面都讲到了。 

 

成员变量总是按照在类定义中的声明顺序进行初始化,构造函数中的初始化列表的顺序被忽略。这么做的原因是需要确保用唯一的顺序销毁成员。一个成员的初始化尽量不要依赖于其他成员。 如果违反这条规则,很多编译器会发出告警。

 

48.构造函数中应使用初始化列表而不是赋值。

 

构造函数悄无声息地生成初始化代码。

 

 

 

实际上构造函数的代码会按照以下代码生成:

 

A() : s1_(), s2_() {s1_ = "Hello, "; s2_ = "world"; }

 

也就是说你没有显式初始化的对象将会使用缺省构造函数进行初始化,并调用赋值操作符赋值,通常一个非平凡对象的赋值操作符比构造函数开销大,因此它需要处理一个已经构造好的对象。使用初始化列表使得代码更小,更快。

 

A() : s1_("Hello, "), s2_("world") {} 

 

例外

 

在构造函数体但不是初始化列表中获取非托管资源,例如通过new分配内存,其结果并未马上传递给智能指针构造函数。当然,最好不要这么做。

 

49.避免在析构和构造中调用虚函数

虚函数在构造和析构中并不表现为虚的。从构造和析构中间接或直接调用一个未被实现的纯虚函数会导致行为未定义。

一个基类B和继承于B的类D,在构造D对象时,调用B构造函数,此时处于构造中的对象的动态类型是B,对虚函数B::fun的调用将调用B的版本,不管D是否对fun进行override。这是很自然的事情,在D对象还没有完全构造好之前调用D的函数会导致混乱。

在构造中,B对象无法知道它是单独的对象或者其派生类对象的一部分。

 

另一方面,有一些设计需要"post-construction",即在构造完成后即刻调用虚函数,以下列出一些实现方法:

1.踢皮球:通过文档记录要求用户代码在构造对象后马上调用post-initialization函数

2.延迟调用post-initialization函数:在第一次调用一个成员函数时调用。用一个boolean标志表示是否已经完成post-construction。

3.使用虚拟基类语义:语言规则规定最低层派生类构造函数可以指定调用哪个基类构造函数。

4.使用工厂函数:可以很容易迫使post-construction函数一定会被调用。

 

没有一种方法是完美的。

 

例:使用工厂函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值