C++中Setter函数的const正确性最佳实践咨询
C++ Setter函数的const正确性答疑
先明确两个核心区别:你Getter里的const是修饰成员函数,保证函数内不会改动类的成员变量;而你纠结的Setter里的const是修饰函数参数,这完全是两个独立的场景。
1. Setter函数中是否应该使用const关键字?
分情况判断:
- 对于
int这类基础类型的传值参数,加不加const没有实际区别——传值时参数是实参的副本,就算你在函数里修改这个副本,也影响不到外部的实参。编译器甚至会把const int val和int val视为同一个函数签名,加不加纯属个人习惯,没有对错之分。 - 如果是传递引用/指针的复杂类型(比如
std::string、自定义类),加const是符合const正确性的必要操作——它能保证函数内部不会意外修改传入的实参,同时也给调用者明确信号:这个函数不会改动你传进来的内容。
2. 最佳实践是什么?
直接按参数类型选择写法:
- 基础类型(int、bool、char等): 传值时可以不加
const,比如void setValue(int val)就足够,加了也没坏处,但属于多余的写法。 - 复杂类型(自定义类、std::string、容器等): 优先使用
const 引用传参,既省去拷贝的性能开销,又通过const约束避免修改实参,这是标准的const正确写法。示例:class MyClass { private: std::string name; public: void setName(const std::string& name) { this->name = name; } }; - 指针参数: 如果传递指针,要修饰指针指向的内容,比如
void setData(const int* data),表示函数不会修改指针指向的内存值。
另外必须注意:Setter函数绝对不能在函数末尾加const(也就是不能写成void setValue(int val) const)——因为Setter的本职就是修改类的成员变量,而加了const的成员函数不允许改动成员变量,这样写会直接编译报错,这也是Getter和Setter在const用法上的核心区别。
最后总结:const正确性的核心是明确哪些内容不会被修改,Setter参数加不加const,本质是看是否需要保证传入的实参不被函数改动,按参数类型选择最合适的写法即可。
内容的提问来源于stack exchange,提问作者Inshal Yousaf
相关产品推荐
相关产品推荐

