关于 const 指针,我有一个基本的问题。使用 const 指针时,我不能调用任何非 const 成员函数。然而,我可以在 const 指针上这样做:
delete p;
这将调用类的析构函数,本质上它是一个非const的“方法”。为什么会允许这种情况?这只是为了支持以下内容吗:
delete this;
还是有其他原因吗?
关于 const 指针,我有一个基本的问题。使用 const 指针时,我不能调用任何非 const 成员函数。然而,我可以在 const 指针上这样做:
delete p;
这将调用类的析构函数,本质上它是一个非const的“方法”。为什么会允许这种情况?这只是为了支持以下内容吗:
delete this;
还是有其他原因吗?
这是为了支持:
// dynamically create object that cannot be changed
const Foo * f = new Foo;
// use const member functions here
// delete it
delete f;
但请注意,问题不仅限于动态创建的对象:
{
const Foo f;
// use it
} // destructor called here
这么说吧 - 如果不允许,就没有办法删除const对象而不使用const_cast。
从语义上讲,const表示一个对象应该是不可变的。然而,这并不意味着该对象不应该被删除。
我不允许使用const指针调用任何非const成员函数。
其实你是可以的。
class Foo
{
public:
void aNonConstMemberFunction();
};
Foo* const aConstPointer = new Foo;
aConstPointer->aNonConstMemberFunction(); // legal
const Foo* aPointerToConst = new Foo;
aPointerToConst->aNonConstMemberFunction(); // illegal
delete aConstPointer; // legal
delete aPointerToConst; // legal
根据其他回答中已经给出的原因,删除任何一个都是合法的。
构造函数和析构函数不应被视为“方法”。它们是特殊的结构,用于初始化和拆除类的对象。
“const指针”用于指示在对象存活期间执行操作时,对象的状态不会被更改。
0
,那么这种区别将更加明显。(这种行为被认为在运行时对所有C++程序来说代价太高,事实上它是不可能完全可靠的。)
更新:九年后重新阅读此文,感觉有点像律师文件。我现在认为您最初的反应是可以理解的。禁止变异但允许销毁显然是有问题的。 const指针/引用的暗示契约是它们的存在将作为目标对象的销毁块,也称为自动垃圾回收。std::unique_ptr<const T>
结束其生命周期时,你该如何处理呢? - Caleth
const Foo * f
或Foo const * f
不是指向常量的指针,而是指向常量 Foo 的指针。Foo * const f
是指向常量 Foo 的常量指针。 - user11373693