C++数据类型之重要关键字详解
引言
💡 作者简介:专注于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
关键字是用来为已有类型定义一个新的别名,可以方便地使用这个别名来代替原有的类型名称。不会创建新的类型。
操作步骤:
-
先用已有的类型定义一个变量,例如:
int num;
-
用别名替换变量名,例如:
int INT32;
-
在整个表达式最前面加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++中的一些重要关键字:
序号 | 关键字 | 描述 |
---|---|---|
1 | auto | 用于自动推断变量类型 |
2 | const | 用于定义常量,表示变量的值不可更改 |
3 | static | 用于静态变量和静态函数的声明 |
4 | extern | 用于声明在其他文件中定义的全局变量或函数 |
5 | inline | 用于行内函数的定义 |
6 | friend | 用于声明友元函数或友元类 |
7 | virtual | 用于定义虚函数,实现多态性 |
8 | new/delete | 用于动态分配和释放内存 |
9 | try/catch/throw | 用于异常处理 |
10 | typedef | 用于给已有类型定义一个别名 |
11 | template | 用于泛型编程和模板类的定义 |
12 | namespace | 用于命名空间的定义,避免命名冲突 |
13 | explicit | 用于构造函数声明,禁止隐式转换 |
14 | mutable | 用于类中成员变量的定义,表示该变量可以修改 |
15 | operator | 用于操作符重载 |
16 | sizeof | 用于返回数据类型或变量所占的字节数 |
17 | typeid | 用于获取对象的类型信息 |
18 | volatile | 用于声明易变变量,防止编译器进行优化 |
19 | register | 用于将变量存储在CPU寄存器中,提高访问速度 |
在C++编程中,const、volatile和sizeof是常用的关键字,它们具有一些秘密功能和用途,深入理解这些关键字的功能可以帮助我们更好地编写高质量的代码。本文将深入探讨const、volatile和sizeof这三个关键字的秘密功能,包括const关键字用于定义常量、volatile关键字用于声明易变变量以及sizeof操作符用于返回数据类型或变量所占的字节数。