![](/img/trans.png)
[英]C++ template function for method with a parameter of a const type or simply of type
[英]c++ should I use const to method of parameter value type?
我有这个例子:
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
并没有多大意义)
它们几乎相等。
唯一的区别是您告诉编译器使用const
时不能在函数范围内修改变量width
。
对于,Void SetWidth(double width);
我们可以使用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);]中提到过。
在内部,编译器为堆栈中的“ width”变量分配内存,并将值复制到该变量。 如果使用第二个原型类型[void SetWidth(const double width);],则可确保在函数内部不能更改可变宽度为常数。
希望这可以帮助。
如果不希望函数修改局部变量的width
,则应将其声明为const
。 这样,如果您无意间尝试分配给变量,或将其地址分配给非const指针(因为这可能会导致对其进行修改),则编译器将发出警告。
两种情况下生成的代码都没有区别,只是启用了这些附加的安全检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.