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会很自然地出现。