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


    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派生类的成员变量



  • 相关阅读:
    前端常用设计模式和工作中应用场景思考
    webpack从零开始打造react项目(更新中...)
    操作系统-进程
    go语言web框架-如何使用gin教程+react实现web项目
    JavaScript逗号运算符的用法
    react的生命周期和使用
    在Vue项目中使用wangEditor
    TypeScript实现axios
    SpringBoot整合邮件发送(thymeleaf和freemarker)
    SpringBoot整合RabbitMQ
  • 原文地址:https://www.cnblogs.com/Erdos001/p/5401203.html
Copyright © 2020-2023  润新知