确保对成员变量的初始化

    赋值和初始化是有区别的,假设声明了一个People类,说明两者:

class People{
private:
	string ID;
	int birth;
public:
	//赋值操作
	People(string & id,int data){	
		ID=id;
		birth=data;
	}
	//初始化操作
	People(string id,int data):ID(id),birth(data){
	}
};

    C++规定:对象成员的初始化动作,发生在进入构造函数本体之前。

    

    基于赋值的构造函数,首先对成员变量设置初始值,然后立刻对他们进行赋值。所以对于大多数的类型来说,比起先调用default构造函数,再调用copy assignment操作符,单一调用一次copy构造函数是比较高效的。而对于内置成员,比如int,其初始化和赋值的成本是相同的。


    成员变量使用初始化的必要性还在于:如果变量使reference 或者const,他们就一定需要初始值,不能被赋值。


    有些时候,对象的成员过多,为了避免进行很多重复的工作,可以不用一直使用初始化列表,而是将那些赋值跟初始化表现一样好的成员变量,改用赋值操作,并可以将其封装到一个函数体中,供构造函数调用。


    注意对成员变量的初始化是按照变量声明的方式进行的,与初始化时的顺序无关。


    有些时候,初始化时,包括static对象------global对象,定义于namespace作用域的对象,在class函数内,以及file作用域内被声明的static对象。在函数体内声明的static对象是local static对象,其他的static对象是non-local static对象(相对于函数体而言的)。


    因为C++对于不同编译单元内的non-local static对象的初始化相对的次序并没有明确定义,所以可能导致的问题:在调用某个对象时,对象可能尚未初始化。解决的思路有,将non-local static对象转换成static对象,即将每一个non-local static对象搬到自己专属的函数体内(对象在函数体中被声明为static),该函数返回reference指向所包含的对象。然后通过调用这些函数来进行操作,而不直接指向这些对象。但对于多线程来说,应该手动进行函数的调用。

People & ps(){
	static People p;
	return p;
}


    总结:

    确保每一个构造函数都将对象进行初始化,对成员内置的对象都手工完成初始化。


    交流群:45503780

你可能感兴趣的:(赋值,初始化)