繁体   English   中英

c + +我应该使用const作为参数值类型的方法吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM