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

C++ “使用”的好处;常数;使用标量类型?(例如“const double”或“const int”),c++,C++,根据我的理解,我们应该 使用A2::funB和A2::setB,因为在 A::funA和A::setA都没有什么意义 //更新// /////////////////////////////////////// class A { ... const double funA(void) {...} }; A a; double x = a.funA(); // although the intention is to // enforce the return val

根据我的理解,我们应该 使用
A2::funB
A2::setB
,因为在
A::funA
A::setA
都没有什么意义

//更新//

///////////////////////////////////////
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)
    {...}
};

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

我认为FMOD是一个设计良好的包,它在函数参数列表中使用<代码> const int <代码>。


现在,我同意
A::setA(const double d)
有它的优势。

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


所以我想说,在编程逻辑中,第二个变量更好,就像你说的,它“意义不大”,但是在更广泛的逻辑中,如果你看到了真正发生的事情,你应该声明const,what is const,而不要声明const what is not const。这是一种编译器理解的文档,可能会用来优化代码

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


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

实际上,标量没有真正的好处

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

在我看来,更改传入参数不是一个好的做法

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

即使您遵循这种做法,也很容易错误地修改变量(典型的键入方式是
=
,而不是
=
,或者通过非常量引用或指针传递参数)。实现中的
const
参数阻止了这种情况


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

但是它限制了您在函数中可以使用的算法,而无需对输入进行不必要的复制。你不想因为函数后面的算法改变而改变函数的定义。@Martin Beckett有些人喜欢复制,因为它保持了输入(初始值)的完整性……我想对你的答案做一个非常非常小的修改。如果按值返回对象,将其设为常量将阻止用户对该值调用非常量方法。显然,用户总是可以将返回的值分配给非常量值,并在那里调用方法这就是我能想到的。我原以为使用if const会阻止您执行“if(foo()=42)”,但事实证明编译器实际上捕获了该错误,因为返回的不是l值。@fronsacqc:按值返回const对象也会抑制移动语义,这从来都不是一件好事。此外,允许在临时变量上调用非常量成员函数可能是一件好事,甚至是惯用的——请参见C++03
std::vector
shrink to fit惯用用法。@MartinBeckett:添加或删除顶级常量限定符并不意味着更改函数的声明。不要将这些常量放在标题中(它们对调用者来说毫无意义),在实现文件中随意操作。我更新了我的OP。我仍然认为在这种情况下,修改传入的双参数不是一个好的做法,而且不应该通过在函数参数列表中冗余使用
const double
来强制执行。不正确。听说过康斯特剧组吗?const的意思是防止你犯错误并修改不应该修改的内容,句号。@q0987:如果这是一种不好的做法,那么如何强制防止这种不好的做法是多余的呢?@q0987有些人推荐这种做法,但当然,如果函数比较复杂,最好保持初始值不变,以备以后需要。对于非常简单的函数(热点),使用参数数据可能是可以接受的。我认为在这种特殊情况下,通过引用传递不会保存任何内容。对于诸如字符串等更具扩展性的对象来说,这当然是最好的。当然,但不要忘记,双精度浮点正在使用FPU寄存器,而不是用于指针和引用的传统寄存器。编译器可能会使用这种技巧来减少FPU负载。您说最好保持参数不变“…除非您希望调用者收到更改…”。在这种特殊情况下,调用方不会收到更改,因为参数是按值传递的。您需要传递一个引用/指针。的可能重复项
    FMOD_RESULT F_API EventSystem::getReverbPresetByIndex(const int index, 
                                FMOD_REVERB_PROPERTIES *props, char **name = 0);