您的位置:首页 > 编程语言 > C语言/C++

const——c与c++不同

2015-12-28 10:27 274 查看
C语言中const:

#include<stdio.h>
int main()
{
const int n = 10;
// int a
;//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
;
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
;
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
;//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与define区别)

const缺点:

一、当初始值为变量时,(如上述所说的),仅仅是这个初始值地址去替代const对象,这比起define,没有省去读内存的操作,效率并没有提高。仅仅是在编译时,编译器把它看作“常量”,对操作有所限制罢了。

二、const仅仅是检查直接改变其值的操作,但是对于间接改变不作处理。比如const数组中元素的间接改变 然而constexpr却好的多。

(点击查看constexpr)

点击查看

const——指针和引用以及复合类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: