0

我有例如这个:

void SetWidth(double width);

应该是:

void SetWidth(const double width);
4

6 回答 6

4

不,你不应该。

编译器将这两个函数签名视为相同,因此通过添加const这样的案例可以完成的所有工作都会误导读者。举一个明显的例子,不太了解 C++ 的读者可能会认为两者兼有:

void SetWidth(double) {}
void SetWdith(const double) {}

...将是合法的函数重载。这当然是错误的——正如已经指出的,编译器将两者视为相同,因此这只会违反一个定义规则。

确实会阻止您修改函数内部的const参数,但如果您的函数足够大以至于您认为您需要它(即,您很难跟踪正在修改的内容和未修改的内容),那么机会很大很好,你需要重写函数。

于 2013-09-02T16:08:47.323 回答
3

从调用者的角度来看,两者是等价的。您可以(并且,为了减少噪音,应该)将其const排除在声明之外,并且仅将其包含在定义中。

从实现者的角度来看,您可能希望这样做,原因与您希望任何局部变量保持不变的原因相同:确保它不会意外更改。

于 2013-09-02T16:08:24.723 回答
1

简短的回答:const当确保(或明确表达)以下内容有意义时,实现一个按值接受参数的函数:“这个参数不会在这个函数的主体内改变。”

并实现一个函数,该函数将const通过引用获取参数,当你想明确告诉调用者:“这个函数不会改变你传递给它的参数。”

(如果“setter”按值接受参数 - 例如SetWidth- 使用它没有多大意义const

于 2013-09-02T16:06:09.770 回答
1

它们几乎是等价的。

唯一的区别是你告诉编译器,width当你使用const.

于 2013-09-02T16:06:29.783 回答
1

对于, 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);],它确保变量宽度是恒定的,不能在函数内部更改。

希望这可以帮助。

于 2013-09-02T16:20:47.810 回答
0

如果函数不希望修改局部变量width,则应声明它const。这样,如果您无意中尝试将其分配给变量,或者将其地址分配给非常量指针(因为这可能允许对其进行修改),编译器将发出警告。

在这两种情况下生成的代码没有区别,它只是启用了这些额外的安全检查。

于 2013-09-02T16:09:15.680 回答