Static const int简单理解

Static const int简单理解,第1张

Static const 是Static 和const的组合(2022.06.03) 1.Static

若一个变量声明为static,则该变量就会储存在程序的静态区域;那么在程序开始运行的时候,该变量就会一直存在,而不是随着所在函数运行终止而终止。(储存在栈中,该为类所有)
另外:static声明的变量必须在类外初始化;

2.const

若一个变量声明为const,则意味着该变量为不可变。所在类实例对象时,才会创建该变量(存在在堆中,该变量为对象所有)。
另外:const声明变量需要在初始化列表中初始化。(还未对其他初始化方式测试,待学习)

3.static const

若一个变量声明为static const,表示变量存储在静态区,且该变量不可改变。
另外:static const声明的变量必须在初始化时赋值。

下面是测试的代码,供参考

#include 

class Const_demo
{
public:
    Const_demo();
    const int c1;
    int c2;
};

Const_demo::Const_demo():c1(1)
{
    c2 = 2;
}

class Static_demo
{
public:
    Static_demo()
    {
    }

    static int s1;
    static const int s2 = 15;
};

int Static_demo::s1 = 10;

int main()
{
    //测试1:static声明的变量在程序开始的位置存在
    std::cout << "Static_demo.s1: " << &Static_demo::s1 << std::endl;         // static 变量
    std::cout << "Static_demo.s2: " << &Static_demo::s2 << std::endl;         // static 变量
    //std::cout << "Const_demo.a: " << Const_demo::a << std::endl;   // 错误提示:非静态变量必须和特定对象使用
    Const_demo C1  = Const_demo();
    Const_demo C2  = Const_demo();
    Static_demo S1 = Static_demo();
    Static_demo S2  = Static_demo();
    //测试2:static声明的变量时,是属于类所有(只有一个地址,为所有对象共有);而const声明的变量为类所对应的对象所有(不同的地址,每个对象中都包含自己的变量)
    std::cout << "C1.a: " << C1.c1 << std::endl;
    std::cout << "C2.a: " << C2.c1 << std::endl;
    std::cout << "C1.a的地址为: " << &C1.c1 << std::endl;
    std::cout << "C2.a的地址为: " << &C2.c1 << std::endl;
    std::cout << "S1.s1: " << S1.s1 << std::endl;
    std::cout << "S2.s1: " << S2.s1 << std::endl;
    std::cout << "S1.s1的地址为: " << &S1.s1 << std::endl;
    std::cout << "S2.s1的地址为: " << &S2.s1 << std::endl;
    //测试3:static声明的变量在程序运行期间可以改变;而Static const声明的变量不可修改
    Static_demo::s1 = 15;
    std::cout << "S1.s1: " << S1.s1 << std::endl;
    std::cout << "S2.s1: " << S2.s1 << std::endl;
    std::cout << "S1.s1的地址为: " << &S1.s1 << std::endl;
    std::cout << "S2.s1的地址为: " << &S2.s1 << std::endl;
    //Static_demo::s2 = 15;                           //错误提示,表达式的左值必须是可修改的
    std::getchar();
}

const(2022.06.04)

关于const,参考C++Primmer 2.4.1节 敲了一遍,
先说自己的观点

只有变量和引用都是常量(const),或者非常量时,两者才会绑定;否则这两个变量赋值后分道扬镳,不存在什么关系。

代码如下

#include 
using namespace std;

int main()
{
    double dval = 3.14;
    const int rd = dval;
    dval = 6.14;
    cout << "rd " << rd << " dval " << dval << endl;

    int ival = 3;
    const int ri = ival;
    ival = 6;
    cout << "ri " << ri << " dval " << ival << endl;

    int i1 = 5;
    int& r1 = i1;
    i1 = 10;
    cout << "i1 " << i1 << " r1 " << r1 << endl;
    r1 = 20;
    cout << "i1 " << i1 << " r1 " << r1 << endl;

    const int i2 = 50;
    const int& r2 = i2;
    cout << "i2 " << i2 << " r2 " << r2 << endl;
    cin.get();
    return 0;
}

这几个变量的地址如下

由上面图案可以看出dval和rd、ival和ri是两个地址,所以是两个变量,赋值后两者不存在什么关系;而i1和r1、i2和r2地址相同,就是同一个东西。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1324130.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-12
下一篇2022-06-12

发表评论

登录后才能评论

评论列表(0条)

    保存