1、类成员不可以在定义时初始化
2、const类型的成员必须在初始化化列表进行初始化;一般变量在在初始化列表中初始化的顺序决定于定义的顺序
#include<iostream> using namespace std; class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <<endl; } }; int main() { A a; a.Print(); getchar(); return 1; }
输出以上结果的时候,以为是n1:2,n2:0吗
错了!
#include<iostream> using namespace std; class A { private: int n1; int n2; public: //A():n2(0),n1(n2+2){} //n1:-858993458, n2: 0 //A():n1(n2+2),n2(0){} //n1:-858993458, n2: 0 //A():n1(0),n2(n1+2){}//n1:0, n2: 2 A():n2(n1+2),n1(0){}//n1:0, n2: 2 void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <<endl; } }; int main() { A a; a.Print(); getchar(); return 1; }
尝试运行以上的例子,可以发现,在用T():name(),name2():{}的形式进行初始化的时候,初始化的顺序是与类中本来类的变量位置的顺序有关,与T():name(),name2():{}的形式中变量名的顺序无关。
3、static类型的成员变量需要在类外进行初始化
原因: 在类中,只是声明了静态变量,并没有定义。 2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。 注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。 3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。 4. 现在,咱们假定要实例化该类的一个对象,那么会发生什么事情呢?静态成员肯定要出现在这个对象里面的,对吧?这时候才去定义那个静态成员吗?这显然是不合适的。因为,比如有另外一个线程也要创建该类的对象,那么也要按照这个方式去定义那个静态成员。这会产生两种可能的情况:1. 重复定义;2. 就算不产生重复定义的情况,也会产生竞争,从而造成死锁的问题,以至于对象无法创建。很显然,编译器不能这么干。那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。 注意:类的静态常量成员可以类内初始化
列子:
#include <iostream.h> class CDummy { public: static int n; //这里只是声明}; int CDummy::n=9; //这里是定义加初始化 void main() { cout < <CDummy::n < <endl; } 上面这样完全没问题,但是不能直接在类中初始化,比如: static int n=9; 4、static的常量可以在类中进行初始化
class A
{
private:
static const int a = 0; //正确
static const char b = ‘b‘; //正确
const int c = 0; //错误,非static const不能在类里面初始化
static const int d[10] = {0}; //错误,只有一般数据类型的static const才能在类里面初始化。
//数组应该在.cpp文件里面初始化
}
初始化顺序总结为:
- 1基类的静态变量或全局变量
- 2派生类的静态变量或全局变量
- 3基类的成员变量
- 4派生类的成员变量