详解C和C++中的const关键字

在讲下面的内容之前,要先看看这篇文章const、static变量的存储位置

一、C中的const

作用:(1)可以定义const常量,具有不可变性。

(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。

(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!

(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错;

(5) 可以节省空间,避免不必要的内存分配。 例如:

#define PI 3.14159 //常量宏

     const double Pi=3.14159; //此时并未将Pi放入RAM中 ......

     double i=Pi; //此时为Pi分配内存,以后不再分配!

     double I=PI; //编译期间进行宏替换,分配内存

     double j=Pi; //没有内存分配

     double J=PI; //再进行宏替换,又一次分配内存!

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

①const变量与常量的区别

C中const变量是由编译器指定的只读数据,存储在只读数据区,但它不是常量,虽然常量也存储在只读数据区,所以不能由它来指定数组的长度。例如下面的是不允许的:

const int n = 5;

int a[n];//编译器将会报错

注意:在C++中定义的变量也是常量,上述用法是合理的。

②const限定变量的方式

const使用的基本形式: const type m;限定m不可变。看下面的例子:

typedef char * pStr;

char string[4] = "bbc";

const char *p1 =" string"; //1式

const pStr p2 =" string"; //2式

p1++;

p2++;//不允许

替换基本形式中的m为1式中的*p1,替换后const char *p1;限定*p1不可变,当然p1是可变的,因此问题中p1++是对的。替换基本形式中的type为2式中的pStr,替换后const pStr m;限定m不可变,题中的pStr就是一种新类型,因此问题中p2不可变,p2++是错误的

二、C++中的const

以上所讲内容在C++中同样适用,另外在C++中const经常用来限定成员函数类型,使其成为常成员函数。const成员函数应该在函数原型说明和函数定义中都增加const限定。

<pre class="cpp" name="code">#include<iostream>
using namespace std;
//const int Y;
class C
{
	const int X;
	int M;
public:
	C(int a = 0,int b = 0):X(a),M(b){}
	int Get() const
	{
		return X;
	}
	//void Set()
	//{
	//	X = 5;
	//}
	int GetX()
	{
		return X;
	}
	//void SetX(int X)
	//{
	//	this->X=X;
	//}
};
void main()
{
	const C constC(5);
	C c;
	cout << constC.Get();
	cout << c.Get();
	cout << c.GetX();
	//cout << constC.GetX();
}

①非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员,所以constC.GetX()将会产生错误。

②常量成员函数定义里面不能修改成员变量的值,所以C::Set()成员函数将会产生错误。

我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。

为了确保const对象的数据成员不会被改变,在C++中,const对象只能调用const成员函数。如果一个成员函数实际上没有对数据成员作任何形式的修改,但是它没有被const关键字限定的,也不能被常量对象调用。

③但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用),它们也能给常量的数据成员赋值。

注:在类中声明的const变量可以不用初始化,但是在其他情况下必须初始化。



详解C和C++中的const关键字,布布扣,bubuko.com

时间: 2024-08-02 06:57:34

详解C和C++中的const关键字的相关文章

详解volatile在C++中的作用

volatile的介绍 volatile类似于大家所熟知的const也是一个类型修饰符.volatile是给编译器的指示来说明对它所修饰的对象不应该执行优化.volatile的作用就是用来进行多线程编程.在单线程中那就是只能起到限制编译器优化的作用.所以单线程的童鞋们就不用浪费精力看下面的了. 没有volatile的结果 如果没有volatile,你将无法在多线程中并行使用到基本变量.下面举一个我开发项目的实例(这个实例采用的是C#语言但不妨碍我们讨论C++).在学校的一个.Net项目的开发中,

Scala 深入浅出实战经典 第60讲:Scala中隐式参数实战详解以及在Spark中的应用源码解析

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/IVN4EuFlmKk/优酷:http://v.youku.com/v_show/id_

(转)web.config详解之在文件中配置网站默认页面

在<configuration></configuration>中添加下面的配置 <system.webServer>        <defaultDocument>            <files>                <clear />                <add value="index.aspx" />                <add value=&qu

详解MindManager 15中文版中格式刷工具

制作MindManager思维导图时,其中很多资源来源于不同的外部资料,因为来源不同,复制粘贴的格式就可能不同. 巧妙使用MindManager 15中文版的格式刷工具可以统一导图的格式,保持导图的美观,本文详解MindManager 15中文版中格式刷工具的操作方法. 格式刷工具设置在开始中的格式刷.MindManager 15中的格式刷不仅可以刷文本,也可以刷字体颜色,甚至主题颜色和形状. 格式刷工具的操作步骤: 步骤一 打开MindManager 15思维导图软件,新建导图. 步骤二 设定

详解Asp.Net Core中的Cookies

目录 详解Asp.Net Core中的cookies 搞懂cookies Asp.Net中cookies的实现 从http中获取cookies 将cookies写入http中 总结及感想 详解Asp.Net Core中的cookies 搞懂cookies 我之前写过一篇文章来介绍cookies,如果你对cookies不是很了解请移步理解cookies这篇文章,这对于我们研究asp.net core中的cookies可以起到很大的帮助. Asp.Net中cookies的实现 cookies是htt

详解js和jquery里的this关键字

详解js和jquery里的this关键字 js中的this 我们要记住:this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象.this对象是在运行时基于函数的执行环境绑定的,在全局环境中,this等于window 先来看个例子: <script> var fullname = "Trigkit4"; var person = { fullname : 'Jack', prop:{ fullname : 'Blizzard', getFullname : fun

C++ 类中的const关键字

//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是this指针 int GetX() const //====>int GetX(const this) { //因为this被隐藏,所以const关键字只好写在函数后面 //x++; //加上const关键字 报错 error C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改 //这个

javaweb part3 ----HTTP协议详解,以及java中request response的类以及方法

HTTP协议详解Requsert Headers 浏览器 向服务器 发送的 请求信息Get /Myweb/persons.html HTTP/1.1 (必须)Host:localhost:8080Connection:keep-alive Accept支持格式:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8User-Agent:兼容浏览器的版本Accept-

详解希尔伯特空间——图像处理中的数学原理详解23

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 交流学习可加图像处理研究学习QQ群(529549320) 有段时间没继续更新我的"图像处理中的数