//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(){
}
Effective C++ Item04 Note
最新推荐文章于 2023-04-24 00:51:28 发布