问题1: 如果写:int i; 在某些语境下保证会被初始化为0,单其他语境中不保证;于是有了“对象的初始化动作何时一定发生?”,但是不幸的是:规则太复杂;
- 因此,最佳处理办法就是:永远在使用对象之前就将他初始化。
对于基本数据类型和非基本数据类型规则分别是:
- 对于无任何的成员的基本数据类型,必须手工完成;
- 对于非基本数据类型,初始化责任落在了构造函数身上,规则为:确保每一个构造函数都将对象的每一个成员初始化。
构造函数中的 赋值和初始化:
赋值:
class my_class{
public:
my_class(const std::string& name,const std::string& address, const int id);
private:
std::string the_name;
std::string the_address;
int the_id;
}
my_class::my_class(const std::string& name,const std::string& address, const int id)
{
the_name=name;
the_address=address;
the_id=id;
}
实质上进行两次操作:1.先调用the_name,the_address,的构造函数,2.调用赋值函数;
初始化:在对象创建的同时使用初值填充对象的内存单元;
my_class::my_class(const std::string& name,const std::string& address, const int id)
{ the_name(name),the_address(address),the_id(id) }
一次操作:调用copy构造函数:the_name和the_address都是以初值进行拷贝的;
- 总结:总是使用初始化列表完成初始化;
问题2:问题1的延伸:静态对象何时被初始化?如何保证位于不同编译单元的静态对象的同步关系?
- 为免除“跨编译单元之初始化次序问题”:简单的规则:将每个non-local static 对象搬到自己的专属函数内(将其声明为static 对象),这些函数返回一个reference 指向该对象;
这个规则的基础在于:C++保证:函数内的local static 对象会在“该函数被调用时”“首次遇上该对象是被初始化”。