C++ static声明与类作用域

主要是分清类定义中static, static const, const以及普通成员

一、static
static声明的变量是全局静态存储的,而类定义中的变量(函数是共有的,数据是各自内存的)是独立的类作用域的,比如类Fruit的两个对象apple和pear,他们内部的数据成员color都是各自的内存的,所以apple.color和pear.color是互不影响的,那么类在定义的过程中分配了内存吗?

class A
{
    //static const int x=3;
//public:
//private:
    //int y=10;

//public:
    const int m_x;
public:
    const int x=7;
    static const int y=3;
    //static int z = 10;
    void print1();
    A(int x);
};

int main()
{

    cout << sizeof(A)<<endl;
}

结果:
8,这个8分别是类作用域中m_x和x的内存,而y是没有分配内存的

在我理解,类以及对象之间的数据内存都是相互对立的,互不影响,上面的m_x和x我特意声明成立const,区别是第一个成员是在构造函数内初始化的,第二个是在类定义中初始化的,有什么意义吗?
const数据成员是一种不可修改的常量(特殊的变量),x=7,那么他在所有的对象中都是不可修改的,如:

    A a(10);
    a.x = 10000;//这里我试图修改x
结果:报错

在这里插入图片描述
所以结论就是这个普通的const成员是对所有对象包括类本身是常量,可以理解为绝对常量;(原因就是类定义中已经定义好该变量的类型,且已经赋值给该内存了)
而m_x是没有在类中初始化的,只分配内存,却没有赋值,此时只知道他它是int类型的const,但具体不知道是啥const,也就是说没有给const型变量赋值,需要在构造函数中赋值,但这在一般情况下是不允许的,我门都知道const一旦出现就必须赋值,如这样:

int main()
{

    const int a;
    cout<<a;
}

在这里插入图片描述
就会报错。。。
而这在类里面是允许的,但是也必须初始化,是通过构造函数初始化的,这样声明的m_x是对于每个对象是常量,可以认为其是相对常量

二、static const
再来比较static和static const
共同点都是存储全局静态存储,链接性为内部
区别:static 声明的变量必须在类外初始化,而static const都行,
好像我的编译器标准就是这样,按照我的理解static const也应该在类外声明,但是可能是因为const的原因 (const允许且要求即刻初始化)
但是static就不行,如下

class A
{

    const int m_x;//这里声明的const成员对于每个对象来说都是可变的,要想声明对每个对象都是不可变的,得用enum
public:
    const int x=7;
    static const int y=3;
    static int z = 10;
    void print1();
    A(int x);
};

结果:
在这里插入图片描述
可以看到报错:不允许在类内初始化非const static成员,由此可见该C++标准是允许初始化const static成员的

总结就是:
const变量应该即刻初始化,虽然在类内部没有即刻初始化,但是可以通过构造函数形成对象的时候初始化( 类是一种类型,而对象是一种变量,在建立对象的时候初始化const相当于正常建立const变量时候的初始化,这么理解应该没错):
const int x = 11;//定义x即初始化
class_name object(…);//定义object即通过构造函数初始化const变量

而如果不通过构造函数初始化,而是直接在类内部初始化,是始终不可修改的,这么做其实也没多大意义;

最后就是static和static const
static 在类外初始化;这个可以用来变量,引用计数等;
而static const允许在类内初始化(可能是因为const关键字的原因)
红字部分均个人理解!!!

你可能感兴趣的:(C语言)