具有所有const属性的类是否需要将成员函数声明为const?

时间:2014-05-03 20:41:09

标签: c++ c++11 attributes const member-functions

标题已经全部说明了。不过我还要稍微扩展一下:我的班级所有属性都是const

template< class perm  = Perm16 >
class PermutationGroup {
public:
  using StrongGeneratingSet = std::vector< std::vector< perm > >;

  const std::string name;
  const uint64_t N;
  const StrongGeneratingSet sgs;
  PermutationGroup(std::string name, uint64_t N, StrongGeneratingSet sgs) :
      name(name), N(N), sgs(sgs) { assert(check_sgs()); };

  bool check_sgs() const;            // defined as const
  bool is_canonical(vect v) const;   // defined as const

  [...]

};

将所有成员函数定义为const是否有用?还是我不必要地重复自己?

4 个答案:

答案 0 :(得分:4)

如果未将成员函数声明为 const ,则无法在 const 对象或 const引用。例如,以下内容不起作用:

const PermutationGroup& group = PermutationGroup("foobar", 42, ...);
group.check_sgs(); // ERROR: can't invoke non-const function on const objects

答案 1 :(得分:0)

将您的方法声明为const意味着您可以在const限定对象上调用它们。没有必要仅仅因为类中没有可变字段来声明它们const,但是一般来说,如果你总是声明不需要&#的方法,那么编写const-correct代码会更容易。 39; t修改任何内容为const

答案 2 :(得分:0)

  

具有所有const属性的类是否需要将成员函数声明为const?

声明成员变量const与声明成员函数const不同。当成员变量声明为const时,无法修改它。即使那些未声明为const的成员函数仍然可以访问它,它们只是无法修改。

对成员函数const进行Decalring表示此函数不会修改此对象。除非声明mutable,否则不允许该函数更改任何成员变量。它也无法调用未声明为const的成员函数,因为这些函数将被允许修改对象。

将成员函数声明为const非常重要,因为它允许在它们所属的类的常量实例上调用这些函数。 Nosid在answer中提供了一个很好的例子。

答案 3 :(得分:0)

不,不。

话虽如此,代表属性的constness意味着代表实例的constness,所以即使成员函数是非const ,它也不能表现得这样(即因为状态突变)

另一种方式并非如此。例如

int myClass::example() const {
    member = 1;
}

相同
int myClass::example() const {
    this->member = 1;
}

和成员函数的constness表示this指针的常量。这与承诺对象结构的“原始位”不会发生变化略有不同。例如,reference members can be modified by const member functions

总结:当成员函数与const指针this一起使用时,将成员函数声明为const变为强制性。在你的情况下,不要将一个声明为const只会是徒劳的(并打破检查员/变异者的语义......这不是一个交易)。