C++中关键字const详解

308 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 ​

这里我们结合代码讲解一下const在C++中的使用

一、const修饰变量

1.当修饰普通变量时,该变量是右值,是只读的。

你可以这样:int num1 = 1024;
const int num2 = num1;

不可以这样:num2 = 2048;(num2是右值,不可修改)

2.const修饰指针变量

       a.只有一个const时,如果const位于*的左侧,表示指针所指的数据是常量,不能通过该指针修改实际数值,

指针本身是变量,可以指向其他内存单元。

用程序演示就是:

    int num1 = 1024,num2 = 2048;
	cout << num2 << endl;
	const int* ptr1_num1 = &num1;
	int const *ptr2_num1 = &num1;//这两种写法都可以,效果一样
	ptr1_num1 = &num2;  //这样合法,通过这种方式也就间接改变了*ptr1_num1 
	//*ptr1_num1 = 1234;//不合法


b.只有一个const时,如果const位于*右侧,表示指针本身是常量,不能指向其他内存单元,所指向的数据可以修改。

用代码表示就是:

int* const ptr3_num1 = &num1;
//ptr3_num1 = &num2; //不合法
*ptr3_num1 = 14;

       c.如果有两个const位于*的两侧,则都不能修改

完整的代码演示:

void ConstDemo1()
{
	int num1 = 1024;
	const int num2 = num1;
	int num3 = 2048;
	//num2 = 2048;  //num2是右值,是只读的
	cout << num2 << endl;
	const int* ptr1_num1 = &num1;
	int const *ptr2_num1 = &num1;
	ptr1_num1 = &num3;  //这样合法
	cout << "*ptr1_num1 = " << *ptr1_num1 << "\t" << "*ptr2_num1 = " << *ptr2_num1 << endl;
	//*ptr1_num1 = 1234;//不合法
	int* const ptr3_num1 = &num1;
	//ptr3_num1 = &num2; //不合法
	*ptr3_num1 = 14;
	cout << "*ptr3_num1 = " << *ptr3_num1 << endl;
	
}

运行结果:

二、修饰函数参数

1.修饰普通的输入参数时,传递来的参数在函数体内不可以被改变,和修饰普通变量的时的性质(上述一、1)一样

void fun(const int num)
{
	//num = 123;//不合法
}

2  修饰的输入参数是引用

const修饰引用时,不能修改引用对象的任何成员,连方法都不能调用,那怎么才能调用成员函数囊?

调用原则:const成员函数不能调用非const成员函数,即在函数生命后面加一个const

//类的定义
class Computer
{
public:
	Computer(int core) { this->m_core = core; }
	~Computer();
	void SetCore(int core) { this->m_core = core; }
	int GetCore() const { return this->m_core; }
	/*void buy(int core)
	{

	}*/
	void buy()const { cout << "success!" << endl; }
private:
	int m_core; //cpu主频

};
void ConstDemo3(const Computer & compu) //大家可以将GetCore()后面的const去掉,会发现根本编译不通过
{
	cout << "the score of compu is" << compu.GetCore() << endl;
	compu.buy();
}
//main
int main(void)
{
	Computer com1 = {10};
	ConstDemo3(com1);
}

调用 结果:

3.3.const修饰返回值,返回值且是引用时
强调:用const修饰引用类型的常见原因:提高效率。当函数返回对象引用的时候更加有效

使用范例(前提是你要保证返回的确实是个输入参数中有的对象):

const Computer & GetMax(const Computer & com1, const Computer & com2)
{
	if (com1.GetCore() > com2.GetCore()) {
		return com1;
	}
	return com2;//返回对象
}

【notice】:

                 如果函数返回局部对象(比如在函数中定义个com3),就应该直接返回这个对象,而不要返回对象的引用,
在可以返回对象,又可以返回引用时,首选引用

三、修饰函数

const修饰函数,意味着在函数中不会修改成员变量的值

这里我们就可以理解为什么当函数参数中有const时,必须要求函数名括号后面也要有const。

          参数中有const,说明输入参数不能被改变,但是函数没加const,不能说明我这个函数是不改变参数值的函数,所以你要加个const声明我这个函数不会修改你的对象里面的值,这样编译器才让你通过