C++ 您多长时间将函数声明为常量?

C++ 您多长时间将函数声明为常量?,c++,constants,const-correctness,C++,Constants,Const Correctness,您觉得它有用吗?每当您知道该方法不会更改对象的状态时,您应该将其声明为常量 它有助于阅读您的代码。当您试图更改对象的状态时,它会有所帮助—编译器会阻止您。当您有const对象时,编译器允许您调用的唯一方法是那些用const关键字标记为安全的方法。事实上,只有成员方法作为const方法才有意义 C++中,对象的每一个方法都接收到一个隐式这个< /COD>指针指向对象;const方法将简单地接收一个const这个指针。假设您正在谈论方法,如: struct Example { void f()

您觉得它有用吗?

每当您知道该方法不会更改对象的状态时,您应该将其声明为常量


它有助于阅读您的代码。当您试图更改对象的状态时,它会有所帮助—编译器会阻止您。

当您有
const
对象时,编译器允许您调用的唯一方法是那些用
const
关键字标记为安全的方法。事实上,只有成员方法作为
const
方法才有意义


C++中,对象的每一个方法都接收到一个隐式<代码>这个< /COD>指针指向对象;

const
方法将简单地接收一个
const
这个
指针。

假设您正在谈论方法,如:

struct Example {
  void f() const;
};

然后,如果它们应该可以在const对象上调用,那么该方法应该尽可能多地使用const.

。不需要更改数据成员的函数应声明为const。这使代码更容易理解,并可能提示编译器进行优化。

不够频繁

虽然所有的答案都是正确的,但如果你使用的是一个不正确的图书馆,那么很难在所有你应该使用它的地方都使用const


如果您有一个旧的API,它接受一个字符*,在所有逻辑上都应该是一个常量字符*,那么您要么在代码中忘记常量,要么进行一些难看的转换。在这种情况下,我忘记了常量。

我过去常常将函数声明为常量,但现在我很少再这样做了

主要的问题是,如果我想将一个函数从常量更改为非常量,这意味着调用该函数的所有其他常量函数也需要更改为非常量

由于优化,这种情况比我想象的要频繁。例如,我有一个GetData()函数,用于返回指向数据的指针,但后来我优化为仅在调用GetData()时设置数据(这会更改对象的状态,因此它不再是常量函数)

对于其他可以在不更改对象状态的情况下执行某些计算的函数,情况也是如此,但在某些情况下,缓存结果更有意义,因为函数被多次调用,并且是一个瓶颈


同样在实践中,至少在我的项目中,我发现将我的函数声明为const几乎没有什么好处。

我几乎在每个机会都使用const,而且它提供了意图的文档并强制遵守该意图。语言特性没有比这更好的了,但奇怪的是,const却不受欢迎。(现实中似乎是大多数自称C++程序员不能解释<代码> int *、int *const、const int */COD>和<代码> const int *const )
虽然它的C起源是不可能发生的,但是我经常认为C++是一种更好的语言,如果const是默认的和自由的洒落(比如)var,或者一些类似的关键字是必要的,允许变量的后构造修改。(很抱歉,没办法)另一种方法是包装API并确定它是否真的应该获取成本数据,如果是这样,则丢弃包装器中输入数据的常量。这意味着您只需要一次丑陋的强制转换,并且您可以通过测试等方式对您确定这是安全和正确的这一事实进行评论。我认为,即使不是所有的“旧API”都应该被包装……不改变“逻辑值”的函数仍然可以是常量,您只需要为缓存使用可变数据成员。是的,同意罗杰的评论。声明为可变的数据成员可以在常量函数中更改。如果该函数甚至不涉及对象状态,而只是将输入参数转换为返回值,那么它应该是静态的。静态>常量成员>普通成员。