变量和类成员的初始化问题

时间:2023-02-07 20:02:13

C++Primer语:
初始化分两种:复制初始化(int a = 1;)和直接初始化(int a(1);)
1,内置类型变量
   在函数体外定义都被初始化成0,在函数体内定义的话不进行初始化

函数体内的局部变量分配在栈里,定义变量只是给了它一个临时的地址,而地址中原来是有数据存在的,只不过对你来说是未知的不确定的。

   内置变量的两种初始化几乎没有差别;
2,类类型变量
   类类型变量通过定义一个或多个构造函数来初始化,假如没有定义构造函数的话,类类型通过默认构造函数(default constructor)来初始化函数,但是只是大部分的类类型有默认构造函数,而没有默认构造函数的类类型必须得进行显式初始化。
   有默认构造函数的比如:string s;       //empty
                         string s(s1);     //将 s初始化为s1
                         string s("akjsjdk");//字符串
                         string s(n ,'c'); //'c'的n个副本
   只有第一种是默认构造函数,其他都是string的构造函数


【JZG_HY】:
1.内置类型变量(int,bool,指针等)的初始化规则
 在函数体外定义的内置类型变量会自动初始化0,函数体内定义的内置类型变量不会初始化。
 全局内置类型变量自然会自动初始化为0。类和函数里面定义的内置类型变量自然不会自动初始化,内置类型的类成员是一样的道理

2.类类型变量的初始化自然是调用构造函数(不论是全局还是局部)。类类型变量的类类型成员自然也是调用自己的构造函数初始化(呵呵,有点绕口吧!)。类类型变量的内置类型成员如第一条所说,不会自动初始化,需要你在初始化列表或构造函数里面初始化。

最后,初始化每个定义的变量是良好的编程习惯,也是每个程序员的职责!


C++初始化类成员的,它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

1. class CMyClass {
2. CMyClass(int x, int y);
3. int m_x;
4. int m_y;
5. };
6. CMyClass::CMyClass(int i) : m_y(i), m_x(m_y)
7. {
8. }

你可能以为上面的代码将会首先做m_y=i,然后做m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。这个例子是故意这样设计来说明这一点的,然而这种bug会很自然地出现。