C/C++经验之const关键字

版权声明:本文为博主原创文章,转载时请标明来源。 https://blog.csdn.net/aiwangtingyun/article/details/86558131

编写C/C++程序时推荐尽量使用const,关键字const有非常多的好处:

一、便于编译器进行类型检查

相对于宏定义,const常量有数据类型,而宏没有数据类型;编译器可以对const常量进行类型安全检查,而宏只有字符替换没有类型安全检查,而且宏在字符替换的时候会产生一堆意想不到的问题。

二、节省内存空间

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

三、提高效率

宏定义是一个“编译时”概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束于编译时期。const常量是一个“运行时”概念,在程序运行时使用,类似于一个只读数据。

编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高

四、保护const所修饰的对象,防止被意外修改

当你按指针或引用传参时,如果不想原对象被修改则添加const关键字可以起到保护作用,函数返回值也一样,返回指针或引用时可以起到保护作用。


const 的作用

const 关键字提供常属性,const关键字修饰的对象具有常属性,即它所修饰的对象不能被修改。

根据const修饰的对象不同而作用不同

1、修饰普通变量(局部或全局)

const int a = 1;
int const b = 2;

这两种写法都是等价的,都表示变量是常数,注意:const变量必须初始化,并且初始化完之后不能再次修改其值。

2、修饰指针变量

const int *p = &a;			// 常量指针
int * const p = &a;			// 指针常量
const int * const p = &a;	// 指向常量的指针常量

const修饰指针总共为上述三种情况,第一种情况的指针叫做常量指针,表示指针指向的对象是常量,即指针指向的对象不能被修改,但指针本身可以被修改;第二种情况的指针叫做指针常量,表示指针是一个常量,指针本身的值不能被修改(需要初始化)但指针指向的对象可以被修改,如果很难理解的话可以想象一下:整型常量表示整型本身是个常量不能被修改,字符常量表示字符本身是个常量不能被修改,所以指针常量就表示指针是个常量不能被修改。第三种情况的指针叫做指向常量的指针常量,表示指针本身不能被修改(需要初始化)而且指针指向的对象也不能被修改。

3、修饰引用

const int &ref = a;
int const &ref = a;

两种写法都一样,都表示引用变量ref是个常量引用,表示不能修改引用的值。

4、修饰类成员函数

const修饰成员函数,表示该函数不能修改类的任何成员变量,包括const成员变量和非const成员变量,除非成员变量用mutalbe关键字声明。
例如:

class A 
{
public:
	const int &getValue() const
	{
		a = 1;		// 错误const成员函数不能修改成员变量
		return a;
	}
private:
	int a;			// 成员变量为非const
}

在类成员函数中,可以通过添加const关键字达到重载函数目的,函数名、参数和返回值一样,但加了const关键字和没加是属于两个重载函数。

5、修饰类对象

const修饰类对象表示该对象为常量对象,不能修改该对象内的任何成员变量,所以只能调用该对象的的const成员函数而不能调用非const成员函数(调用非const成员函数可能会修改成员变量)。

 class A
 {
 public:
    void nomalFunc() {}
    void constFunc() const {}
 };

 int main(void)
 {
    const A test;
    a.constFunc();    		// 正确
    a.nomalFunc();    		// 错误

    const A* pTest = new A();
    pTest->constFunc();    	// 正确
    pTest->nomalFunc();    	// 错误
}

猜你喜欢

转载自blog.csdn.net/aiwangtingyun/article/details/86558131
今日推荐