本文已参与「新人创作礼」活动,一起开启掘金创作之路。
这里我们结合代码讲解一下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声明我这个函数不会修改你的对象里面的值,这样编译器才让你通过