Effective C++ Item04 Note

//Effective C++ Item05
#include<iostream>
#include<cstring>
#include<list>
using namespace std;
//array(来自C part of C++)不保证其内容被初始化,vector(STL part of C++)却有此保证
//C++对不同编译单元内的non-local static对象的初始化顺序并无明确定义
//如果某编译单元内的某个non-local static对象的初始化动作使用了另一编译单元内的某个non-local static对象,它所用到的这个对象可能尚未被初始化
//解决方法是将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static)。这些函数返回一个reference指向它所含的对象
//因为C++保证函数内的local static对象会在该函数被调用期间首次遇上该对象之定义式时初始化
//这些函数内含static对象的事实使它们在多线程系统中带有不确定性
//解决方法是在程序的单线程启动阶段手工调用所有reference-returning函数
class PhoneNumber{
private:
	int*number;
public:
	PhoneNumber(int*number){
		this->number = number;
	}
};
class ABEntry{
private:
	string theName;
	string theAddress;
	list<PhoneNumber> thePhones;
	int numTimesConsulted;
public:
	//对象成员变量的初始化发生在进入构造函数本体之前,使用member initialization list替换赋值操作,避免了default构造之后再赋值,效率较高
	//对于内置类型成员变量,如果不在member initialization list中就没有初值,此时必须在构造函数中赋值,内置类型成员变量初始化和赋值成本相同
	//如果成员变量是const或reference就一定需要初值,不能被赋值
	ABEntry(const string&name, const string& address, const list<PhoneNumber>& phones) :theName(name), theAddress(address), thePhones(phones){
		//这里是对成员变量进行赋值,初始化发生在这些成员变量的default构造函数被自动调用之时
		//theName = name;
		//theAddress = address;
		//thePhones = phones;
	}
};
int main(){

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值