【发布时间】:2011-10-19 15:37:20
【问题描述】:
(编辑:由于前面的示例存在缺陷,可能会导致一些答案/cmets 看起来很奇怪)
这可能有点做作,但由于缺少 const 构造函数,以下是合法的:
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 重载。
注意:我不是在寻找“Image( const Data & data ) const”,而是在寻找“const Image( const Data & data) const”
所以:
- 为什么 C++ 中没有 const 构造函数?
这里有一些与上下文相关的材料:
【问题讨论】:
-
@honk 这些不是复制构造函数。
-
这似乎是一个矛盾:一个 const 成员函数承诺不修改成员变量,所以一个 const 构造函数也必须遵守这一点。然而构造函数的目的是修改它的成员变量,因此是矛盾的。
-
@sashan 同意了。它本身不是 const 方法,而是返回一个指向新对象的 const 指针,但仅在
new const的情况下才被允许,其方式与 not 允许非 const 方法相同与 const 对象一起使用。 -
@Catskul:所以,您要求的是能够创建一个永远以非常量方式访问的对象。因此,您可以(理论上)使用 const 值初始化非 const 成员,因为这些非 const 成员在语法上将通过使用 const-only 构造函数变为 const。
-
@sashan et al “但是构造函数的目的是修改它的成员变量” - 不,构造函数的目的是初始化它的成员变量。这是一个巨大的差异。请注意,当您创建普通的 const bultin 时,您还必须对其进行初始化,否则它是无用的。所以应该清楚的是,当您执行以下操作时:
const int x = 6,您初始化x- 而不是修改 它。上面是一个不好的例子,但是 const 构造函数应该存在并且它们在其他应用程序中会很有用。
标签: c++ constructor constants