【008】C++必备知识:const、volatile和sizeof等重要关键字的秘密功能细说

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【007】C++数据类型之原码、补码、反码
🔔 下一篇:【009】C++数据类型之转义字符和类型转换

一、const修饰普通变量

C++中,const关键字修饰普通变量表示该变量的值是不可修改的,即它是一个常量。常量必须在定义时进行初始化,之后就不能再改变其值。

例如:

const int a = 10;
a = 20; // 编译错误,a是一个常量,值不可修改。

在函数参数中,使用const可以防止函数改变传入的参数的值。

例如:

void printValue(const int value) {
  // value += 1; // 编译错误,value是一个常量,值不可修改。
  cout << "The value is: " << value << endl;
}

注意,在C++中,使用const修饰一个变量并不意味着它一定会被存储在只读内存中。编译器仍然有可能将其放在可写内存中,只是在代码中访问该变量时会禁止修改它的值。因此,如果需要确保变量的值不被修改,应该使用更加严格的措施,如C++11中的constexpr或C++17中的std::string_view等。

重点说明

(1)如果是以常量初始化const修饰的变量,那么只读变量的值事先存放在 “符号常量表”,不会立即开辟空间。只有当对其取地址时,系统才会为其开辟空间。

示例:

#include <iostream>

using namespace std;

int main()
{
	const int data = 100;
	int *p = (int *)&data;
	*p = 2000;
	cout << "data = "<<data << endl;
	cout << "*p = " << *p << endl;
	
	return 0;
}

输出:

data = 100
*p = 2000

在这里插入图片描述
(2)如果以变量初始化const修饰的只读变量,那么只读变量会立即开辟空间,此时就没有符号常量表。
示例:

#include <iostream>

using namespace std;

int main()
{
	int a=10;
	const int data = a;
	int *p = (int *)&data;
	*p = 2000;
	cout << "data = "<<data << endl;
	cout << "*p = " << *p << endl;
	
	return 0;
}

输出:

data = 2000
*p = 2000

(3)const修饰自定义类型变量,立即开辟空间,此时也没有符号常量表。

二、register修饰寄存器变量

我们都知道,CPU访问寄存器的速度比内存快到多。
在这里插入图片描述
如果变量被高频使用,系统会自动将变量存储在寄存器中,目的是提高访问效率。

如果用户想将变量直接放在寄存器中,可以使用register修饰。例如:

register int data=0;

注意,尽量不要对寄存器变量取地址,因为寄存器是没有地址的。register修饰的变量只是尽量将变量放入寄存器,而不是一定能够放入寄存器中,因为寄存器是很珍贵的。

三、volatile强制访问内存

强制访问内存,防止编译器优化。使对变量的访问必须每次都从内存上取。

volatile int data=0;

在这里插入图片描述

四、sizeof测试类型的大小

C++的sizeof关键字用于测试类型、变量或表达式占用的存储空间大小,其语法为:

sizeof (类型/变量/表达式)

其中,类型可以是任意C++数据类型,变量和表达式必须是已经定义或声明过的。

对于不同的类型,sizeof返回的值也会不同。下面是一些常见类型的sizeof值示例:

sizeof(char)      // 1
sizeof(short)     // 2
sizeof(int)       // 4
sizeof(long)      // 32位平台是4字节,64位平台是8字节
sizeof(float)     // 4
sizeof(double)    // 8
sizeof(bool)      // 1
sizeof(pointer)   // 4 or 8 (depending on the system)

需要注意的是,sizeof返回的值以字节为单位。在不同的编译器和操作系统中,sizeof返回的值可能会略有差异。

五、typedef关键字

C++的typedef关键字是用来为已有类型定义一个新的别名,可以方便地使用这个别名来代替原有的类型名称。不会创建新的类型。

操作步骤:

  1. 先用已有的类型定义一个变量,例如:

    int num;
    
  2. 用别名替换变量名,例如:

    int INT32;
    
  3. 在整个表达式最前面加typedef,例如:

    typedef int INT32;
    

示例:

typedef int myInt;
myInt x = 10; // 等价于 int x = 10;

另外,typedef也可以用来定义复杂类型的别名,如指针、数组、结构体等。

例如:

typedef int* IntPointer;
IntPointer p; // 等价于 int* p;

typedef int IntArray[5];
IntArray a = {1,2,3,4,5}; // 等价于 int a[5] = {1,2,3,4,5};

typedef struct {
    int age;
    char name[20];
} Person;
Person p1 = {18, "Tom"}; // 定义一个Person结构体

六、总结

C++中的一些重要关键字:

序号关键字描述
1auto用于自动推断变量类型
2const用于定义常量,表示变量的值不可更改
3static用于静态变量和静态函数的声明
4extern用于声明在其他文件中定义的全局变量或函数
5inline用于行内函数的定义
6friend用于声明友元函数或友元类
7virtual用于定义虚函数,实现多态性
8new/delete用于动态分配和释放内存
9try/catch/throw用于异常处理
10typedef用于给已有类型定义一个别名
11template用于泛型编程和模板类的定义
12namespace用于命名空间的定义,避免命名冲突
13explicit用于构造函数声明,禁止隐式转换
14mutable用于类中成员变量的定义,表示该变量可以修改
15operator用于操作符重载
16sizeof用于返回数据类型或变量所占的字节数
17typeid用于获取对象的类型信息
18volatile用于声明易变变量,防止编译器进行优化
19register用于将变量存储在CPU寄存器中,提高访问速度

在C++编程中,const、volatile和sizeof是常用的关键字,它们具有一些秘密功能和用途,深入理解这些关键字的功能可以帮助我们更好地编写高质量的代码。本文将深入探讨const、volatile和sizeof这三个关键字的秘密功能,包括const关键字用于定义常量、volatile关键字用于声明易变变量以及sizeof操作符用于返回数据类型或变量所占的字节数。
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值