目录
c中的const
C++中的const
const修饰指针
const修饰引用
-
const是construct的缩写,是c/c++语言中的类型限定符,采用const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。
-
c中的const
在c语言中,用const定义一个常量的时候,编译器会直接开辟一个内存空间存放该常量,不会进行优化。 并且当我们用一个指针去指向该变量的时候我们是可以对该变量进行修改的。
因此,在C语言中的const是“假常量”,用const修饰一个变量的时候,会为该变量开辟一个空间,我们可以利用一个指针去指向该变量,然后间接修改该空间的值。但c++中却不是这样。
-
C++中的const
c++中用const定义了一个常量后,不会分配一个空间给它,而是以key-value(键值对)的形式写入符号表(symbol table),这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
这个特性令c++中的const修饰变量时类似于宏定义#define
因此c++中const修饰的变量是“真常量”,而c++中也不允许对一个常量取地址。如果对const修饰的变量取地址,编译器会临时开辟一个栈空间,让这个指针存放这个临时空间的地址。因此通过指针去修改const变量,是修改该临时空间中的值。
-
const修饰指针
在c++中,const修饰指针变量时,const在代码中位置不同,修饰涵义也不同,分为顶层const和底层const。
顶层const,表示指针本身是个常量
底层const,表示指针指的对象是一个常量
-
引用本质上是一个常量指针,在编译过程中对一个引用操作赋值时会隐藏。
int main()
{
const int n = 10; // C语言中以变量为主。
int arr[n] = { 1,2 }; // error;
int* p = (int*)&n; //
*p = 100;
printf("%n = %d *p = %d n", n, *p);
return 0;
}
int main()
{
const int n = 10; // C++ 语言中以常量为主。
int arr[n] = { 1,2,3,4 }; // ok;
int* p = (int*)&n;
*p = 100;
cout << "n = " << n << " *p = " << *p << endl;
int b = 0;
int* ip = (int*)&a;
*ip = 100;//a=10
b = a;//b=10
cout << a << b << *ip << endl;//10 10 100
return 0;
}