C++数据类型之重要关键字详解
- 引言
- 一、const修饰普通变量
- 重点说明
- 二、register修饰寄存器变量
- 三、volatile强制访问内存
- 四、sizeof测试类型的大小
- 五、typedef关键字
- 总结
引言
💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu
🔔 上一篇:【007】
一、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++中的一些重要关键字:
-
auto:用于自动推断变量类型。
-
const:用于定义常量,表示变量的值不可更改。
-
static:用于静态变量和静态函数的声明。
-
extern:用于声明在其他文件中定义的全局变量或函数。
-
inline:用于行内函数的定义。
-
friend:用于声明友元函数或友元类。
-
virtual:用于定义虚函数,实现多态性。
-
new/delete:用于动态分配和释放内存。
-
try/catch/throw:用于异常处理。
-
typedef:用于给已有类型定义一个别名。
-
template:用于泛型编程和模板类的定义。
-
namespace:用于命名空间的定义,避免命名冲突。
-
explicit:用于构造函数声明,禁止隐式转换。
-
mutable:用于类中成员变量的定义,表示该变量可以修改。
-
operator:用于操作符重载。
-
sizeof:用于返回数据类型或变量所占的字节数。
-
typeid:用于获取对象的类型信息。
-
volatile:用于声明易变变量,防止编译器进行优化。
-
register:用于将变量存储在CPU寄存器中,提高访问速度。