-
Notifications
You must be signed in to change notification settings - Fork 0
/
effective_CPP_确定对象被使用前已先被初始化
54 lines (46 loc) · 3.02 KB
/
effective_CPP_确定对象被使用前已先被初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
int x = 0;//对int进行手初始化
const char* text = "A C——style string";//对指针进行初始化
double d;
std::cin >> d;//以读取input stream的方式完成初始化
至于内置类型以外的初始化的任何其他东西,初始化责任落在构造函数(constructors)身上。规则:确保每一个构造函数都将对象的每一个成员初始化。
C++规定,对象的初始化动作发生在进入构造函数本体之前。
赋值(assignment)与初始化(initialization)的区别:
class PhoneNumber{...};
class ABEntry{
public:
ABEntry(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones);
private:
std::string theName;
std::string theAddress;
std::list<PhoneNumber> thePhones;
int numTimesConsulted;
};
ABEntry::ABEntry(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones)
{
theName = name;
theAddress = address;
hePhones = phones;
numTimesConsulted = 0;
}
//这只是这个函数的成员变量的赋值,而非初始化
ABEntry构造函数的一个较佳的写法是,使用所谓的member initialization list(成员初值列)替换赋值动作。
构造函数:
ABEntry::ABEntry()(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones)
:theName(name),
theAddress(address),
thePhones(phones),
numTimesConsulted(0)
{}
如果成员变量是const或者reference,它们就一定需要初值,不能被赋值。
P30:
关于初始化的问题:所谓static对象,寿命从构造出来直到程序结束为止,因此stack和heap-based对象都被排除。这种
对象包括global对象、定义于namespace作用于域内的对象、在class类内、在函数内、以及在file作用于内被声明为static
的对象。在函数内部的static的对象称为local static对象(因为他们对函数而言是Local),其他static对象称为non-local static对象。
程序结束时static对象会被自动销毁,也就是它们的析构函数在Main()结束时被自动调用。
C++对于定义不同编译单元内的non-local static对象的初始化次序并没有明确定义.这个原因是:决定它们的初始化次序相当困难.常见形式是,多个编译单元内的non-local
static对象经由"模板隐士具体化"形成,不但不可能决定正确的初始化次序,甚至不值得寻找"可决定正确次序"的特殊情况.
经过一个小小的设计可以完全消除初始化这个问题:
将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static).这些函数返回一个reference指向它所含的对象.然后用户调用这些函数,而
不是直接指涉这些对象.换句话,,non-local static对象被local static对象替换了.
C++保证函数内的local static 对象会在"该函数被调用期间""首次遇上该对象之定义式"时被初始化.所以以"函数调用"(返回一个reference指向local static对象)替换
")直接访问non-local static对象",