【发布时间】:2012-01-12 10:25:33
【问题描述】:
考虑一下
class Foo
{
public:
Foo(){}
~Foo(){}
void NonConstBar() {}
void ConstBar() const {}
};
int main()
{
const Foo* pFoo = new Foo();
pFoo->ConstBar(); //No error
pFoo->NonConstBar(); //Compile error about non const function being invoked
delete pFoo; //No error
return 0;
}
在主函数中,我同时调用 Foo
的 const 和 non const 函数尝试调用任何非 const 函数会在 Visual Studio 中产生类似这样的错误
error C2662: 'Foo::NonConstBar' : cannot convert 'this' pointer from 'const Foo' to 'Foo &'
但delete pFoo 不会发出任何此类错误。 delete 语句必然会调用没有 const 修饰符的 Foo 类的析构函数。析构函数也可以调用其他非 const 成员函数。那么它是否是 const 函数?还是 const 指针 上的 delete 是一个特殊异常?
【问题讨论】:
-
构造函数最肯定被认为是初始化,而不是实例的修改。析构函数也是如此。它不会修改实例,它会破坏 is。
-
¤ 在注释参考手册定义的准标准 C++ 中,当
p的类型为T const*时,您不能执行delete p。在标准化期间(C++ 于 1998 年标准化),这条规则被颠倒过来,既不切实际又不一致。使用标准 C++ 的规则,对象在构造过程中是可变的,无论客户端代码的类型如何;如果声明的类型是const,那么它在其主要生命周期内变得不可变;最后为了破坏,构造过程被反转,这意味着它再次是可变的。这意味着您可以delete p。干杯&hth., -
@Alf... 我认为您的评论应该是一个答案
-
standard's paragraph。你也可以明确地销毁它。但是删除它是另一个故事(另一个段落)。
标签: c++ destructor