const单词字面意思为常数,不变的。它是c/c++中的一个关键字,是一个限定符,它用来限定一个变量不允许改变,它将一个对象转换成一个“常量”。
2、C/C++中的const的区别
2.1、C中的const
C语言中的const是一个只读变量,既然是变量那么就会给const分配内存,并且在中const是一个全局只读变量,C语言中const修饰的只读变量是外部连接。
2.2、 C++中的const
在C++中,一个const不必创建内存空间。一般说来,如果一个const仅仅用来把一个名字用一个值代替(就像使用#define一样),那么该存储局空间就不必创建。如果取一个const地址, 或者把它定义为extern,则会为该const创建内存空间。
C++中的const默认内部链接 ,extern可提高作用域使C++中的const作为外部链接(C++中其他的标识符一般默认为外部连接)。
C语言代码——内部外部展示
// 内部 #define _CRT_SECURE_NO_WARNINGS #include#include #include int main(){ extern const int a; //告诉编译器在a在外部 printf("a = %d n ", a); system("pause"); return EXIT_SUCCESS; }
//外部 const int a = 10; //C语言中默认const是外部链接
C++代码——内部外部展示
//内部 #define _CRT_SECURE_NO_WARNINGS #includeusing namespace std; int main(){ extern const int a; cout << a << endl; system("pause"); return EXIT_SUCCESS; }
//外部 //const int a;此代码在C++中是无法使用的,因为const在C++中默认为内部链接 //所以我们需要在前面加extern以扩展const作用域 extern const int a = 10; //C++中的const默认内部链接 ,extern提高作用域
C++——const空间分配展示
#define _CRT_SECURE_NO_WARNINGS #include3、C++对C语言的加强之const#include using namespace std; //1、const取地址 会分配临时内存 //2、extern 编译器也会给const变量分配内存 void test01() { const int m_A = 10; int *p = (int *)&m_A; } //3、 用普通变量初始化 const 的变量,会分配内存 void test02() { int a = 10; const int b = a; int *p = (int *) &b; *p = 20; cout << "b = " << b << endl; } //4、 自定义数据类型加const也会分配内存 struct Role { string m_Name ; //姓名 int m_Age; }; void test03() { const Role r1; Role *p = (Role *)&r1; p->m_Name = "胡桃"; (*p).m_Age = 16; cout << "姓名: " << r1.m_Name << " 年龄: " << r1.m_Age << endl; } int main() { //test02(); test03(); system("pause"); return EXIT_SUCCESS; }
我不太会用文字表示C++对C语言const的加强,请看以下代码和其注释
C语言代码
const int A = 10; //全局变量,受到保护,不可以改 void test() { //A = 100; const int B = 20; // 常变量(伪常量) //B = 100;//不可直接修改 int * p = (int *)&B;//可以用指针修改,修改后p和B的值都为10 *p = 10; printf("*p = %d , B = %d n", *p, B);// p = 10 B = 10 //int arr[B]; 不可以初始化数组 }
因为,C语言中,const修饰的变量是常变量,会分配内存,所以指针修改后都会进行改变。
C++代码
const int A = 10; //全局变量,受到保护,不可以改 void test() { const int B = 20; //真正的常量 //B = 100;//不可直接修改 int * p = (int *)&B; //用指针修改后,p的值改变,B的值不变 *p = 10; cout << "*p = " << *p << endl;//p = 10 cout << "B = " << B << endl;//B = 10 int arr[B]; //可以初始化数组 }
因为,C++中,const修饰的变量是真常量,不会分配内存,在用指针修改的时,会分配一临时内存,所以修改后只有*p值改变,B的值不会改变。
void text{ const int B = 20; int * p = (int *)&B; *p = 10; } ——————其转变过程如下—————— int LinShi = B; //LinShi有空间 int *p = (int*)&LinShi;//*p指向的是临时的空间 //这个过程是不显示的