1.类中成员变量使用Static const修饰的作用(2022.06.03)
| const | static | static 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版权协议,转载请附上原文出处链接和本声明。