Static和const理解

1.类中成员变量使用Static const修饰的作用(2022.06.03)


conststaticstatic const
储存在哪?堆区静态区域静态区域
初始化应注意列表初始化?类外初始化声明时必须初始化
所有者对象
是否可改变不可可改变不可

1.1Static

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

1.2const

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

1.3static const

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

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

#include <iostream>

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();
}

2.const(2022.06.04)

关于const,参考C++Primmer 2.4.1节

代码如下

#include <iostream>
using namespace std;

int main()
{
    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;
    
    int i3 = 3;
    const int& r3 = i3;
    i3 = 30;
    //r3 = 40;   这里会报错"左值必须为可修改的表达式",所以常量不可修改
    cout << "i3 " << i3 << " r3 " << r3 << endl;

    const int i4 = 4;  // 这里如果没有对i4进行初始值设定会报错:常量 变量 i4需要初始设定值
    //int& r4 = i4;     // 会报错,所以无法将非const引用绑定到const对象 
    cin.get();
    return 0;
}

输出
在这里插入图片描述
变量地址
在这里插入图片描述

有个疑问哈:r3本身不可改变,但是r3可以通过i1间接改变值,有什么应用场景吗?

3.const修饰函数参数

#例如
void function(const string& s){...}

这种通过引用传递(相对于值传递),也就是形参s与实参是同一个参数(地址相同),const表明不会改变参数的值。

我有个疑问哈,请各位大佬解惑一下:如果不加&,仅仅是const string修饰,有什么用途吗?应用场景是什么?

#例如
void function(const string s){...}

版权声明:本文为weixin_44493244原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。