在C++类的setter函数中使用const的作用是什么?
我正在通过教材复习C++知识,期间遇到一段简化后的代码示例:
class MyClass{ private: int count; double price; string name; public: void setValues(const int&, const double&, const string&); }; void MyClass::setValues(const int& c, const double& p, const string& n){ count = c; price = p; name= n; } int main(){ myClass pOne; pOne.setValues(5, 0.75, "Kiwi"); return 0; }
我之前以为const关键字只是用来声明不可修改的常量,方便编译器优化。但这段代码里setValues的参数都用了const引用,我却能反复调用这个函数修改MyClass对象的属性,想请教这些参数用const的作用到底是什么?
这里的const是用来约束函数内部不能修改传入的参数本身,和你修改类的成员变量完全是两码事,具体作用分这几点:
避免误操作修改参数:比如你在函数里不小心写了
c = 10;,编译器会直接报错,防止你误改传入的原始数据(虽然这里是传引用,但加了const就锁死了参数的修改权限)。支持传入常量和临时对象:如果不用const引用,你直接传字面量(比如代码里的
5、0.75、"Kiwi")或者临时生成的对象时,编译器会报错——因为非const引用不能绑定到临时值。加了const引用就没问题,这也是为什么代码里setValues(5, 0.75, "Kiwi")能正常运行的原因。性能优化(针对复杂类型):对于
string这种非基本类型,传值会做一次拷贝,而传const引用可以避免拷贝开销,同时又保证不会修改原数据。像int、double这种基本类型,其实传值和传const引用性能差别不大,但很多人习惯统一写法,或者为了代码一致性这么做。代码可读性和语义明确:看到const引用参数,别人一眼就知道这个函数不会修改传入的参数,能快速理解函数的意图,减少阅读代码的成本。
简单说,这个const管的是函数里能不能改参数c、p、n,不管你能不能改类里的count、price、name,两者完全不冲突。
内容的提问来源于stack exchange,提问作者Stuhli

