将"const"与标量类型一起使用的好处?(例如 "const double"或"const int")


///////////////////////////////////////
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

//更新//

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

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

当按值返回时,常量没有作用,因为它无论如何都不能强制执行。有些编译器会发出警告。但是,返回指向常量数据的指针/引用是有意义的。

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

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

所以我会说,在编程逻辑,第二个变体是更好的,就像你说它有"小意义",但在更广泛的逻辑,如果你看到真正发生了什么,你应该声明const,什么是const,不要声明const什么不是const。这是一种编译器可以理解的文档,可能会用来优化你的代码!

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

不是一个好的做法

那么通过在函数定义的实参上使用const来声明它是有意义的。并不是每个人都遵循这种做法,所以对于将来的代码读者来说,在实参上设置const比扫描整个函数体来查找对实参的修改要好。

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

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

在实践中,标量没有真正的好处。

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

相关内容

最新更新