【问题标题】:Does a class with all attributes const need to have member function declared const as well?具有所有属性 const 的类是否也需要将成员函数声明为 const ?
【发布时间】:2014-05-03 20:41:08
【问题描述】:

标题已经说明了一切。不过让我稍微扩展一下:我有一个所有属性都是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 是否有用?还是我不必要地重复自己?

【问题讨论】:

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


    【解决方案1】:

    如果不将成员函数声明为 const,则不能在 const 对象或由 const 引用引用的对象上调用它们>。例如,以下内容将不起作用:

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

    【讨论】:

    【解决方案2】:

    将您的方法声明为const 意味着您可以在const-qualified 对象上调用它们。没有必要仅仅因为类中没有可变字段而将它们声明为const,但通常,如果您始终将不修改任何内容的方法声明为const,则编写 const 正确的代码会更容易。

    【讨论】:

      【解决方案3】:

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

      声明成员变量const 与声明成员函数const 不同。当一个成员变量被声明为const 时,它不能被修改。即使没有声明const的成员函数仍然可以访问它,只是无法修改。

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

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

      【讨论】:

      • you cast away it's constness with const_cast 会调用未定义的行为,不是吗?
      • @hivert 尝试修改非可变对象将导致 UB。即使包括那对我来说也是一个糟糕的决定;)
      【解决方案4】:

      不,它没有。

      也就是说,代表属性的常量意味着代表实例的常量,所以即使一个成员函数是non const,它也不能表现得像这样(即导致状态突变)

      反之亦然。例如

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

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

      并且成员函数的常量意味着this指针的常量。这与承诺对象结构的“原始位”不会改变略有不同。例如reference members can be modified by const member functions

      总结:当与this 指针(即const)一起使用时,必须将成员函数声明为const。在您的情况下,不将其声明为 const 将是徒劳的(并且会破坏检查器/突变器的语义......这不是一笔交易)。

      【讨论】:

        猜你喜欢
        • 2014-06-20
        • 1970-01-01
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-04
        • 2017-02-10
        相关资源
        最近更新 更多