C语言中const:
#include<stdio.h>
int main()
{
const int n = 10;
// int a[n];//error: []内必须为常量表达式
*(int *)(&n) = 20;
printf("%d\n", n);
const int array[5] = { 1,2,3,4,5 };
*((int *)(&array)+2) = 100;
for (int i = 0; i < 5; i++)
{
printf("%d ", array[i]);
}
//getchar();
return 0;
}
在C语言中,无论初始值为变量还是常量,编译器并没有对const修饰的变量和const修饰的数组进行优化,仅仅只是限定了在const修饰变量上的一些操作,这些操作不能直接的改变变量的值,比如++ 、--等。但是可以间接的改变其值,比如间接的通过指针来改变(程序中所示)。
C++中的const:
一、当const变量的初始值为常量或常量表达式时
#include <iostream>
using namespace std;
int main()
{
const int n = 10; //(10的十六进制为a)
int array[n];
cout << &n << endl;
*(const_cast<int *>(&n)) = 1024;
cout << n << endl;
const int Array[5]{ 1,2,3,4,5 };
*(const_cast<int *>(Array) + 2) = 100;
for each (int i in Array)
{
cout << i << endl;
}
//cin.get();
return 0;
}
在c++中,当const修饰的变量初始值为常量表达式时,c++编译器会对其进行优化,在编译阶段会将所有的用到该const变量的地方都用这个常量所替代,作用和define相似,同时也对const变量上的操作进行限制,但是通过间接改变还是能够改变了const变量所在内存的值(如上图),并且const修饰的数组和C语言一样并没有进行优化。
#include <iostream>
using namespace std;
int main()
{
const int a = 10;
const int n = a;
int array[n];
cout << &n << endl;
*(const_cast<int *>(&n)) = 1024;
cout << n << endl;
const int Array[5]{ 1,2,3,4,5 };
*(const_cast<int *>(Array) + 2) = 100;
for each (int i in Array)
{
cout << i << endl;
}
cin.get();
return 0;
}
同上述情况。因为a是一个常量表达式,在编译时就会用10替代a。
二、当const变量的初始值为变量时
#include <iostream>
using namespace std;
int main()
{
int a = 10;
const int n = a;
//int array[n];//error: []内必须为常量表达式
cout << &n << endl;
*(const_cast<int *>(&n)) = 1024;
cout << n << endl;
cin.get();
return 0;
}
在c++中,当const变量的初始值为变量时, c++编译器不会进行优化,效果和c程序运行的一样,仅仅知识对const变量上的操作有所限制仅仅检查直接改变的操作,对间接改变的操作不检查。
综上所述:
const是一个类型限制符,本质上是对变量所在的存储空间有所限制——只能读不能写,就是这个限制导致了const的各种语法特性。
无论是c++还是c,在对待const变量时,在编译时,都检查这个变量是否有修改其值得操作。同时都能间接改变变量的值而在编译时不会被编译器发现,并且都对数组中改变的操作不进行优化处理。除了这些相同点之外,c++还对变量进行优化,当变量的初始值为常量表达式时,c++编译器就会将程序中所有用到该变量的位置用这个常量表达式代替,当初始化为变量时不做任何处理。
C++中const优点:
const最大的优点在于const修饰的对象并不算是一个完完全全的常量而是一个“伪常量”,本质是一个变量,只不过对其存储空间和编译器行为有所限制,所以这个“伪常量”就完全享受c++带来的严格类型检查机制,比起define使用起来更安全。
const缺点:
一、当初始值为变量时,(如上述所说的),仅仅是这个初始值地址去替代const对象,这比起define,没有省去读内存的操作,效率并没有提高。仅仅是在编译时,编译器把它看作“常量”,对操作有所限制罢了。
二、const仅仅是检查直接改变其值的操作,但是对于间接改变不作处理。比如const数组中元素的间接改变 然而constexpr却好的多。
const——指针和引用以及复合类型