我有例如这个:
void SetWidth(double width);
应该是:
void SetWidth(const double width);
不,你不应该。
编译器将这两个函数签名视为相同,因此通过添加const
这样的案例可以完成的所有工作都会误导读者。举一个明显的例子,不太了解 C++ 的读者可能会认为两者兼有:
void SetWidth(double) {}
void SetWdith(const double) {}
...将是合法的函数重载。这当然是错误的——正如已经指出的,编译器将两者视为相同,因此这只会违反一个定义规则。
确实会阻止您修改函数内部的const
参数,但如果您的函数足够大以至于您认为您需要它(即,您很难跟踪正在修改的内容和未修改的内容),那么机会很大很好,你需要重写函数。
从调用者的角度来看,两者是等价的。您可以(并且,为了减少噪音,应该)将其const
排除在声明之外,并且仅将其包含在定义中。
从实现者的角度来看,您可能希望这样做,原因与您希望任何局部变量保持不变的原因相同:确保它不会意外更改。
简短的回答:const
当确保(或明确表达)以下内容有意义时,实现一个按值接受参数的函数:“这个参数不会在这个函数的主体内改变。”
并实现一个函数,该函数将const
通过引用获取参数,当你想明确告诉调用者:“这个函数不会改变你传递给它的参数。”
(如果“setter”按值接受参数 - 例如SetWidth
- 使用它没有多大意义const
)
它们几乎是等价的。
唯一的区别是你告诉编译器,width
当你使用const
.
对于, void SetWidth(双宽度);
我们可以在函数 SetWidth() 中更改变量宽度的值。但是,更改后的值不会反映回被调用的函数。说,
class A_Class
{
public:
void SetWidth(double width) {
width=width+10;
this._width=width;
std::cout<<"IN SetWidth:"<<width;
}
private:
double _width;
};
int main()
{
A_Class aObj;
double twidth=20.9;
aObj.SetWidth(twidth);
std::cout<<"twidth:"<<twidth;
return 0;
}
O/P: IN SetWidth:30.9
twidth:20.9
因此,是否将其设为 const 并不重要,您在另一个原型 [void SetWidth(const double width);] 中已经提到过。
内部编译器为堆栈中的“宽度”变量分配内存,并将值复制到该变量。如果您使用第二个原型[void SetWidth(const double width);],它确保变量宽度是恒定的,不能在函数内部更改。
希望这可以帮助。
如果函数不希望修改局部变量width
,则应声明它const
。这样,如果您无意中尝试将其分配给变量,或者将其地址分配给非常量指针(因为这可能允许对其进行修改),编译器将发出警告。
在这两种情况下生成的代码没有区别,它只是启用了这些额外的安全检查。