首页 > 编程语言 >【C++深度解析】9、const 常量?只读变量?

【C++深度解析】9、const 常量?只读变量?

时间:2023-05-16 21:04:40浏览次数:52  
标签:const 变量 只读 rx C++ nrx printf

文章目录
1 const 常量的判别准则
1.1 编程实验
2 小结

看了前面的关于 const 的内容,不知道是不是有疑问,const 什么时候为只读变量,什么时候是常量?
1 const 常量的判别准则
只有用字面量初始化的 const 常量才会进入符号表
使用其他变量初始化的 const 常量仍然是只读变量
被 volatile 修饰的 const 常量不会进入符号表
综上所述,在编译期间不能直接确定初始值的 const 标示符,都被作为只读变量处理。

const 引用的类型与初始化变量的类型

相同:初始化变量成为只读变量
不同:生成一个新的只读变量
1.1 编程实验
// 9-1.c
#include<stdio.h>
int main()
{
const int x = 1;
const int& rx = x;
int& nrx = const_cast<int&>(rx);
nrx = 5;
printf("x = %d\n", x);
printf("rx = %d\n", rx);
printf("nrx = %d\n", nrx);
printf("&x = %p\n", &x);
printf("&rx = %p\n", &rx);
printf("&nrx = %p\n", &nrx);

volatile const int y = 2;
int* p = const_cast<int*>(&y);
*p = 6;
printf("y = %d\n", y);
printf("p = %p\n", p);

const int z = y;
p = const_cast<int*>(&z);
*p = 7;
printf("z = %d\n", z);
printf("p = %p\n", p);

char c = 'c';
char& rc = c;
const int& trc = c;
rc = 'a';
printf("c = %c\n", c);
printf("rc = %c\n", rc);
printf("trc = %c\n", trc);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
程序第 5-8 行,x 通过字面量初始化,是常量,存储在符号表中;rx 通过变量 x 初始化,不能在编译器确定初始值,是只读变量;nrx 通过 const_cast 去掉了只读属性。修改nrx 修改的是内存的值,不能修改符号表中的值,所以 x 值不变,rx 和 nrx 值修改为 5。rx 是 x 的引用,nrx 是 rx 的引用,所以三者的地址是相同的。
第 16-18 行,变量 y 被 volatile 修饰,是只读变量,指针 p 使用 const_cast 去除其只读属性,并指向变量 y,修改指针 p 指向的值也就是修改了内存,y 变为 6。
第 22- 24 行,const 修饰的 z 通过变量 y 初始化,具有只读属性,指针 p 通过const_cast 去除其只读属性,并指向 z,修改 *p 也就是修改了内存值,所以 z 被修改为 7。
第 28-30 行,trc 为 const int 型的引用,c 为 char 变量,类型不同,trc 生成一个新的只读变量,所以修改 rc 会 改变 c 的值,但是不影响 trc。
编译运行:

$ g++ 9-1.c -o 9-1
$ ./9-1
x = 1
rx = 5
nrx = 5
&x = 0x7ffee6ed4440
&rx = 0x7ffee6ed4440
&nrx = 0x7ffee6ed4440
y = 6
p = 0x7ffee6ed4444
z = 7
p = 0x7ffee6ed4448
c = a
rc = a
trc = c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
当 const 修饰的变量是只读变量时,仅仅是说明不能通过这个只读变量修改内存的值,但是可以通过其他方法修改内存值。

2 小结
1、const 引用能够生成新的只读变量
2、编译时不能直接确定初始值的 const 标示符都是只读变量
————————————————
版权声明:本文为CSDN博主「-出发-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/happyjacob/article/details/104091999

 

标签:const,变量,只读,rx,C++,nrx,printf
From: https://www.cnblogs.com/im18620660608/p/17406772.html

相关文章

  • c++打卡第二十八天
    一、以圆类Circle及立体图形类Solid为基础设计圆柱类Cylinder1、题目描述以点类Point及平面图形类Plane为基类公有派生圆类Circle,再以圆类Circle及立体图形类Solid为基类公有派生圆柱类Cylinder,main(void)函数完成对圆柱类Cylinder的测试。Point类结构说明:Point类的数据成员......
  • c++ - 为什么要在构造函数上使用 constexpr?
    我知道 constexpr 允许您在编译时将对象用作常量,但是什么时候这会有益呢?我试图更好地理解关键字,但我找不到一个很好的例子来解释为什么需要它的构造函数。下面的两个例子都有效,那么为什么要将constexpr放在构造函数上呢?在构造函数上使用constexpr:#include<iostream>us......
  • C++随笔:内联(inline)
    内联(inline)    内联函数以牺牲源文件大小为代价减小程序运行的时间,内联函数类似于一种编译器控制的复制/粘贴功能,当一个函数内部逻辑执行的消耗要远小于函数调用本身的消耗时,会额外增加栈空间的消耗,而被标记为内联的函数,编译器会直接将函数的定义“粘贴”到代码的调用处,直接......
  • C++
    计算时间相减定义一个时间类,小时和分钟是其两个私有成员数据。输入一个起始时间和一个结束时间(起始时间早于结束时间),通过运算符重载-(减号),计算这两个时间相隔多少分钟。说明:这两个时间在同一天之内,且采用24小时计时分式,即从00:00-23:59。输入格式:测试输入包含若干测试用例,每个......
  • C++:全局变量和static变量初始化
    (一)全局变量全局变量、文件域中的静态变量、类中的成员静态变量在main函数执行前初始化;局部变量中的静态变量在第一次调用时初始化。C++保证,全局变量在main函数第一次使用它之前,就把它初始化好。(可以直接理解成在main函数执行前就初始化好)但这个初始化可细分为:编译时初始化和运......
  • c++输入输出流对象
    实验项目名称:输入输出流一、实验目的掌握文本文件和二进制文件的基本访问方法;了解一般I/O流和文件流的关系;了解文件与文件流的关系;了解文件系统的概念,包括文件指针和关于文件的操作;掌握文件类的定义和相关操作的定义、使用方法;掌握利用常用函数进行文件的打开、关闭、读写......
  • c++打卡练习(31)
    求两个整数的最大公因数流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ intx,y,i,k; cout<<"请输入两个整数"<<endl; cin>>x; cin>>y; if(x<y){ intt; t=x; x=y; y=t; } for(i=y;i>=1;i--){ if(x%i==0&&y%i=......
  • c++打卡练习(30)
    不重复的三位数用1234这四个数组成不重复的三位数,每个数位的数也不同,问都有谁流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ inta,b,c,d; for(a=1;a<=4;a++){ for(b=1;b<=4;b++){ for(c=1;c<=4;c++){ if(a!=b&&a!=c&&b!=c){ cout<<a&......
  • C++ | 运算符重载
    1.运算符重载1.1基本概念函数重载(函数多态)是指用户能够定义多个名称相同但参数列表不同的函数,旨在使用户能够用同名的函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。实际上,很多C++(也包括C语......
  • 《c++徒步》vs界面详解
    vs2010字符集:多字节字符集和Unicode字符集是不同的字符集标准,主要区别如下:字符编码范围不同:多字节字符集使用单字节或多个字节来表示字符,编码范围较窄,通常只能表示本地语言的字符集。Unicode字符集则是全球通用的字符编码标准,可以同时表示全球范围内的多种语言字符集。字......