删除指向const(T const *)的指针
我有一个关于const指针的基本问题。 我不允许使用const指针调用任何非const成员函数。 不过,我可以在const指针上做这个:
delete p;
这将调用类的析构函数,实质上是非常量的“方法”。 为什么这是允许的? 仅仅是为了支持这个:
delete this;
还是有其他原因?
这是为了支持:
// dynamically create object that cannot be changed const Foo * f = new Foo; // use const member functions here // delete it delete f;
但请注意,问题不仅限于dynamic创build的对象:
{ const Foo f; // use it } // destructor called here
如果不能在const对象上调用析构函数,我们根本就不能使用const对象。
把它这样 – 如果不允许的话,将不可能不使用const_cast删除const对象。
在语义上,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指针”是指当对象处于活动状态时对其执行操作时,对象的状态不会被改变。
看看它的另一种方法:const指针的确切含义是,您将无法更改指向对象,通过该指针或任何其他指针或对同一对象的引用可见。 但是,当一个对象破坏时,所有其他指向先前被现在删除的对象占用的地址的指针都不再是指向该对象的指针 。 它们存储相同的地址,但该地址不再是任何对象的地址(事实上,它可能很快会被重用为另一个对象的地址)。
如果C ++中的指针像弱引用一样,这个区别就会更加明显,即一旦对象被销毁,所有现存的指针立即被设置为0
。 (这是在运行时被认为是太昂贵的东西强加在所有的C ++程序,事实上是不可能的,使其完全可靠。)