ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

初识c++中的const

2019-09-03 21:42:29  阅读:157  来源: 互联网

标签:10 constA 变量 int c++ 初识 const


const概述

const单词字面意思为常数,不变的。它是c/c++中的一个关键字,是一个限定符,它用来限定一个变量不允许改变,它将一个对象转换成一个常量。

const int a = 10;
A = 100; //编译错误,const是一个常量,不可修改

C中的const

c中的const理解为”一个不能改变的普通变量”,也就是认为const应该是一个只读变量,既然是变量那么就会给const分配内存,并且在c中const是一个全局只读变量,c语言中const修饰的只读变量是外部连接的

const int arrSize = 10;
int arr[arrSize];//会报错。因为arrSize占用某块内存,所以C编译器不知道它在编译时的值是多少

C++中的const

在c++中,一个const不必创建内存空间,而在c中,一个const总是需要一块内存空间。
在c++中,是否为const常量分配内存空间依赖于如何使用。

1. 如果一个const仅仅用来把一个名字用一个值代替(就像使用#define一样),那么该存储局空间就不必创建。
2. 取一个const地址, 或者把它定义为extern,则会为该const创建内存空间。

( 在c++中,出现在所有函数之外的const作用于整个文件(也就是说它在该文件外不可见),默认为内部连接,c++中其他的标识符一般默认为外部连接。)

C/C++中const异同总结

1.全局const

1.c语言全局const会被存储到只读数据段。
2.c++中全局const当声明extern或者对变量取地址时,编译器会分配存储地址,变量存储在只读数据段。
(两个都受到了只读数据段的保护,不可修改。)

2.局部const

  1. c语言中局部const存储在堆栈区,只是不能通过变量直接修改const只读变量的值,但是可以跳过编译器的检查,通过指针间接修改const值。
const int constA = 10;
int* p = (int*)&constA;
*p = 300;
printf("constA:%d\n",constA);
printf("*p:%d\n", *p);
输出:constA:300
	 *p:300

2.c++中对于局部的const变量要区别对待

  1. 对于基础数据类型,也就是const int a = 10这种,编译器会把它放到符号表中,不分配内存,当对其取地址时,会分配内存。
const int constA = 10;
int* p = (int*)&constA;
*p = 300;
cout << "constA:" << constA << endl;
cout << "*p:" << *p << endl;

输出:constA:10
	 *p:300

*constA在符号表中,当我们对constA取地址,这个时候为constA分配了新的空间,p操作的是分配的空间,而constA是从符号表获得的值。

  1. 对于基础数据类型,如果用一个变量初始化const变量,如const int a = b,那么也是会给a分配内存。
int b = 10;
const int constA = b;
int* p = (int*)&constA;
*p = 300;
cout << "constA:" << constA << endl;
cout << "*p:" << *p << endl;

输出:constA:300
	 *p:300

constA 分配了内存,所以我们可以修改constA内存中的值。

  1. 对于自定数据类型,比如类对象,那么也会分配内存。

补充

1. c中const默认为外部连接,c++中const默认为内部连接。
2. 如果想让c++中的const具有外部连接,必须显示声明为: extern const int a = 10。
在c中,编译器对待const如同对待变量一样,只不过带有一个特殊的标记,意思是”你不能改变我”。在c++中定义const时,编译器为它创建空间,所以如果在两个不同文件定义多个同名的const,链接器将发生链接错误。简而言之,const在c++中用的更好。
3. 尽量以const替换#define

标签:10,constA,变量,int,c++,初识,const
来源: https://blog.csdn.net/zh_ch_yu/article/details/100527745

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有