const——c与c++不同

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使用起来更安全。                  

(点击查看constdefine区别)

  const缺点:

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

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

(点击查看constexpr)

 


点击查看

const——指针和引用以及复合类型












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值