C++类中变量定义初始化总结

时间:2022-09-09 20:56:14

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;
}
C++类中变量定义初始化总结

 

输出以上结果的时候,以为是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派生类的成员变量