Effective C++ 条款4-确定对象被使用前已先被初始化

一、内置数据类型 在被使用前 应该先被初始化

	//定义变量时直接进行初始化
	int x = 0;//直接在定义int型变量时 初始化为0
	const char* text = "A C-style string!";//在定义C类型的 字符串时直接进行初始化
	
	//通过读取input stream(输入流) 的方式来完成初始化
	double b;
	cin >> b;

二、自定义数据类型 在被使用前 应该先被初始化

        正确示范:

(Effective C++ 推荐我们 写类的构造函数时都用成员初始化列表member initialization list 来初始化成员属性,这是一种高效的做法!)

class PhoneNumber {...};
class ABEntry
{
public:
	ABEntry(const string & name, const string& address, const list<PhoneNumber>& phones);

private:
	string theName;
	string theAddress;
	list<PhoneNumber>  thePhones;
	int numTimesConsulted;
};
ABEntry::ABEntry(const string & name, const string& address, const list<PhoneNumber>& phones) 
	:theName(name), theAddress(address), thePhones(phones), numTimesConsulted(0){}

        但此时可能你会对赋值和初始化操作产生疑惑,不妨再来看以下代码:

//重写构造函数(用给各个成员属性赋值的方式)
ABEntry::ABEntry(const string & name, const string& address, const list<PhoneNumber>& phones)
{
	theName = name;
	 theAddress = address;
	 thePhones = phones;
	 numTimesConsulted = 0;
}

        这即是assignment赋值操作。这样做会导致ABEntry对象会带有你期望(你指定)的值,但不是最佳做法。C++规定,对象的成员变量(成员属性)的初始化动作是发生在进入构造函数本体之前的。在ABEntry的构造函数内,theName,theAddress,thePhones都不是被初始化,而是被赋值。初始化的发生时间会更早,发生于这些成员的default构造函数(默认构造)被系统自动调用之时(比进入ABEntry有参构造函数本体的时间更早)。但这对numTimesConsulted不为真,因为它是内置数据类型,不保证一定在你所看到的那个赋值动作的时间点之前就获得初值了。

        因此构造函数的较佳写法即是:用所谓的成员初始化列表member initialization list  来替换赋值动作!

三、对于“不同编译单元内定义之non-local-static对象的初始化序列”问题,请以 local static 对象来替换non-local static 对象

未完待续。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fanfan21ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值