我有一个关于const指针的基本问题。我不允许使用const指针调用任何非const成员函数。但是,我可以在const指针上执行此操作:
delete p;
这将称为本质上是非常量“方法”的类的析构函数。为什么允许这样做?只是为了支持这一点:
delete this;
还是还有其他原因?
Answers:
支持:
// 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对象。
const Foo * f
或Foo const * f
不是指向Foo的const指针。对const Foo来说更辛苦了。Foo * const f
是指向Foo的const指针。
这么说吧-如果它未被允许就没有办法删除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
您已经将指向非const对象的const指针与指向const对象的非const指针混淆了。
话说回来,
delete aConstPointer; // legal
delete aPointerToConst; // legal
由于此处其他答案已经说明的原因,删除其中一个是合法的。
观察它的另一种方式:const指针的确切含义是,您将无法对指向的对象进行更改,而该更改可以通过该对象或任何其他指针或对同一对象的引用看到。但是,当一个对象销毁时,指向以前由现在删除的对象占用的地址的所有其他指针不再是指向该对象的指针。它们存储相同的地址,但是该地址不再是任何对象的地址(实际上,它很快可能会被重新用作其他对象的地址)。
如果C ++中的指针表现为弱引用,即当对象被销毁时,指向该对象的所有现有指针将立即设置为,则这种区别将更加明显0
。(这种情况在运行时被认为过于昂贵,无法强加于所有C ++程序,并且实际上不可能使其完全可靠。)
更新:九年后读回这本书,很像律师。我现在发现您的原始反应是可以理解的。禁止突变但允许破坏显然是有问题的。const指针/引用的隐含约定是,它们的存在将充当破坏目标对象(即自动垃圾回收)的障碍。
通常的解决方案是改用几乎所有其他语言。
std::unique_ptr<const T>
结尾的生命呢?