使用标量类型的“const”的好处? (例如“const double”或“const int”)

时间:2011-12-06 21:11:03

标签: c++

///////////////////////////////////////
class A {
    ...
    const double funA(void)
    {...}
};

A a;
double x = a.funA(); 
// although the intention is to
// enforce the return value to be const and cannot be
// modified, it has little effect in the real world.

class A2 {
    ...
    double funB(void)
    {...}
};

///////////////////////////////////////
class A {
    void setA(const double d)
    { // now you cannot change the value of d, so what?
      // From my point of view, it is NOT a good practice to change the pass-in parameter
      // in this case, unless you want the caller to receive that change
      // instead, you can do 
      // const double dPassIn = d;
      / /then use dPassIn instead.
      ...
    }
};

class A2 {
    void setB(double d)
    {...}
};

//////////////////////////////////////

从我的理解,我们应该更喜欢 使用A2::funBA2::setB,因为 const 用于 A::funAA::setA都没什么意义。

//更新//

    FMOD_RESULT F_API EventSystem::getReverbPresetByIndex(const int index, 
                                FMOD_REVERB_PROPERTIES *props, char **name = 0);

我认为FMOD是一个设计良好的软件包,它在函数参数列表中使用const int。 现在,我同意A::setA(const double d)有其优势。

4 个答案:

答案 0 :(得分:6)

按值返回时,常量无效,因为无论如何都无法强制执行。一些编译器发出警告。但是,将指针/引用返回到常量数据是有意义的。

将参数传递给函数时,最好(更安全,允许编译器优化)将其作为常量传递,除非您绝对需要更改数据。

答案 1 :(得分:3)

const-keyword告诉编译器“在我的函数setB中我不会更改参数。如果你想优化多线程,你可以在另一个上下文中使用这个变量同时,因为我的工作不会改变它。”

所以我会说,在Progamming逻辑中,第二种变体更好,就像你说它具有“意义不大”,但是如果你看到真正发生的事情就更广泛的逻辑,你应该声明const,什么是const,以及不要声明const是什么不是const。它是编译器理解的文档,可能会用于优化代码!

答案 2 :(得分:1)

在实践中,标量没有实际好处。

但是,理论上它可以帮助编译器执行其他优化,例如传递对常量的引用而不是复制double值。

答案 3 :(得分:1)

  

从我的观点来看,改变传递参数

并不是一个好习惯

然后通过在函数定义中对参数使用const来声明它是有意义的。并非所有人都遵循这种做法,因此对于未来的代码读者而言,在参数上使用const比在必须扫描整个函数体以修改参数更好。

即使您遵循惯例,也很容易错误地修改变量(=的经典错字而不是==或通过非const ref或指针传递arg)。实现中的const参数可以防止这种情况。

另一方面,声明中的const int参数(如果与定义不同)没有意义。