对于内置类型以外的任何东西,初始化责任落在构造函数身上,规则很简单:确保每一个构造函数都将对象的每一个成员初始化。但有的时候我们容易混淆了赋值和初始化举一个简单的例子:
class Name { public: Name(std::string n); ~Name(); private: std::string name; }; Name::Name(std::string n) { name=n; //这并非初始化,而是赋值。 } Name::Name(std::string n):name(n) //真正意义上的初始化 { }
另外,构造函数的参数初始化列表顺序并不能代表实际成员的初始化顺序,实际成员初始化顺序按声明的顺序。
2.对于不同编译单元我们如何确定在使用前出初始化?将non-local static 转化为 local static。
lass FileSystem { public: std::size_t numDisks() const; }; extern FileSystem tfs; FileSystem& tfs() { static FileSystem fs; return fs; } Directory::Directory(params) { std::size_t disks = tfs().numDisks(); std::size_t disks2 = tfs.numDisks(); //不能确定tfs在使用时已经进行初始化 }