为什么 C++ 没有 const 构造函数?

2021-12-30 00:00:00 constructor constants c++

(由于之前的示例存在缺陷,因此进行了重大更改,这可能会使某些答案/评论看起来很奇怪)

这可能过于做作,但由于缺少 const 构造函数,以下是合法的:

This might be an overly contrived, but the following is legal because of lack of const constructor:

class Cheater
{
public:
    Cheater(int avalue) 
       : cheaterPtr(this) //conceptually odd legality in const Cheater ctor
       , value(avalue) 
    {}

    Cheater& getCheaterPtr() const {return *cheaterPtr;}
    int value;

private:
    Cheater * cheaterPtr;
};

int main()
{
    const Cheater cheater(7); //Initialize the value to 7

    cheater.value                 = 4;    //good, illegal
    cheater.getCheaterPtr().value = 4;    //oops, legal

    return 0;
}

似乎提供一个 const 构造函数在技术上与 const 方法一样简单,并且类似于 const 重载.

It seems like providing a const constructor a thing would be as easy technically as const methods, and be analogous to a const overload.

注意:我不是在寻找Image(const Data & data) const"而是const Image(const Data & data) const"代码>'

Note: I'm not looking for 'Image( const Data & data ) const' but rather 'const Image( const Data & data) const'

所以:

  • 为什么 C++ 中没有 const 构造函数?

这里有一些相关的上下文材料:

Here's some related material for context:

  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0798.htm
  • 如何处理const对象中非常量引用成员的初始化?
  • C++、类、常量和奇怪的语法

推荐答案

它本身不会是一个 const 方法

It would not be a const method itself

如果这个构造函数本身不是一个 const 方法,那么内部指针等也不会是 const.因此,它无法将 const 值设置为那些非 const 成员.

If this constructor were not a const method itself, then the internal pointers and such would also not be const. Therefore, it could not set const values into those non-const members.

让它在语法上工作的唯一方法是让这个构造函数要求所有非可变成员的成员初始化.本质上,当使用此构造函数时,任何未声明 mutable 的成员都将隐式声明 const.这相当于使构造函数成为 const 方法;只有初始化器可以初始化成员.构造函数的主体不能对非可变成员做任何事情,因为那些成员在那时将是 const.

The only way to make it work syntactically is for this constructor to require member initialization for all non-mutable members. Essentially, any member not declared mutable would be implicitly declared const when using this constructor. Which is equivalent to making the constructor a const method; only initializers could initialize members. The constructor's body could do nothing with non-mutable members, because those members would be const at that point.

您所要求的在语法上是可疑的.您实际上是在试图欺骗 API,将常量数据存储在为可变数据设计的对象中(这就是您没有将成员指针声明为 const 的原因).如果您希望某个对象具有不同的行为,则需要声明该对象以具有该特定行为.

What you are asking for is syntactically dubious. You're essentially trying to hoodwink the API, storing constant data in an object that is designed for mutable data (which is why you didn't declare the member pointer to be const). If you want different behavior for an object, you need to declare the object to have that specific behavior.

相关文章