2010-03-10 58 views

回答

24

每次你知道该方法不会改变对象的状态时,你应该声明它是不变的。

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

+0

如果函数甚至没有触及对象状态,而只是将输入参数转换为返回值,那么它应该是静态的。静态>常量成员>普通成员。 – Lucas 2010-03-11 00:04:43

6

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

在C++中,对象的每种方法都会收到指向对象的隐式指针this;一个const方法将简单地收到一个constthis指针。

3

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

struct Example { 
    void f() const; 
}; 

当然,如果他们应该是一个const对象上调用,该方法应该是常数。

11

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

2

不经常不够....

虽然所有的答案是正确的,如果你使用的是libary不是const correct话,就很难使用常量你应该使用它的地方。

如果你有一个旧的API,需要一个的char *,对于所有逻辑的目的应该是为const char *,那么你要么必须忘记常量在你的代码或者做一些丑陋的铸造。在那种情况下,我忘记了const。

+2

另一种方法是封装API并确定它是否真的应该花费成本数据,如果是这样,则在您的包装器中丢弃输入数据的常量。这意味着你只需要丑陋的铸造一次,你可以评论你通过你的测试确定这是安全和正确的事实等。恕我直言,大多数,如果不是所有'旧的API'应该被包装... – 2010-03-10 07:37:18

0

我曾经把函数声明为const,但现在我很少再做它了。

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

由于优化,发生的次数比我想象的要多。例如,我有一个GetData()函数,它用于返回一个指向数据的指针,但后来我进行了优化,只在GetData()最终被调用时才设置数据(这会更改对象的状态,所以它不再是一个常量功能)。

同样的事情可以做一些计算而不改变对象的状态,但在某些时候更有意义的缓存结果,因为该函数被调用很多次,并且是一个瓶颈。

另外在实践中,至少对于我的项目,我看到将我的函数声明为const的好处很少。

+3

功能哪不改变“逻辑值”仍然可以是const,你只需要为你的缓存使用可变数据成员。 – 2010-03-10 07:58:01

+0

是的,同意罗杰的评论。声明为mutable的数据成员可以在const函数内进行更改。 – jasonline 2010-03-10 08:08:18

1

我在几乎每一个机会都使用const,并且就像它提供了两个意向文档并强制符合该意图。语言特征并没有比这更好,然而const好奇地不受欢迎。(现实情况似乎是,大多数自称为C++程序员不能解释int*, int*const, const int*const int*const之间的区别。)

虽然它可能永远不会发生,因为它“C”的起源,我常常想,C++会如果const是默认值,并且需要(比如说)'var'或一些类似的关键字以允许在构建后修改变量,那么将其作为更好的语言。

相关问题