• c++类的 static 和const那些事


    1.static成员变量(非const)必须在类外定义,在类中只是作为声明(声明其scope为该类),不能使用类初始化成员列表来初始化,只能在定义的时候初始化。

    2.static const的成员变量必须在类中定义的时候就初始化,不能在类外再定义,不能使用类初始化成员列表初始化。

    3.static 与 virtual不能共存于一个函数上,即没有静态虚函数,原因在于静态函数没有this指针,无法通过对象实例来调用,而虚函数与普通成员函数一样必须通过this指针来调用。但是static成员可以通过类实例或类来调用,即A a; a.b或A::b都可。

    4.非static的const成员,和引用类型的成员,因为在定义的时候就必须初始化,所以必须使用类初始化成员列表来初始化。

    5.在一个函数的最后加上const,则这个函数只能是一个成员函数,而且是非静态的。因为const的函数就隐含着“this指针所指的对象不能被修改”这个意思。同时,const函数不能对任何成员函数做赋值等修改的动作,而且如果一个实例是const实例,这个实例只能调用const函数。

    6.static成员在编译的时候就已经确定了(未显式初始化的则为0)。而普通成员则在创建实例的时候初始化。

    故一个类对象里面的成员的初始化顺序:

    程序加载时确定:

    a.静态成员变量的空间及值。

    b.成员函数的空间及地址。

    创建对象时(运行时)确定:

    c.虚函数表(如果该类或该类的任一个基类,超类有虚函数)

    e.普通成员变量的空间及值。

    #include<iostream>
    using namespace std;
    
    class A
    {
    public:
        int a;
        static int b;
        const int c;
        static const int d = 4;
    public:
        A(int i,int j):c(i),a(j){}
        void print(){}
    };
    
    int A::b;//这个值默认为0,因为static成员放在全局静态区。
    
    int main()
    {
        A a(1,2);
        cout<<a.a<<endl;
        cout<<a.b<<endl;
        cout<<a.c<<endl;
        cout<<a.d<<endl;
    }
  • 相关阅读:
    如何用Map对象创建Set对象
    SpringMVC如何接受POST请求中的json参数
    Eclipse启动的时候提示:Failed to load JavaHL Library.
    spring中的scope详解
    synchronized 与 Lock 的那点事
    (转)Lock和synchronized比较详解
    java事件机制
    linux查看内存占用情况
    Linux命令简写和全称
    人类未来思考
  • 原文地址:https://www.cnblogs.com/ylan2009/p/4320632.html
Copyright © 2020-2023  润新知