2011-02-28 39 views
4

我看到的代码片段如下:如何在const成员函数中调用“delete this;”?

class UPNumber { 
public: 
    UPNumber(); 
    UPNumber(int initValue); 
    ... 

    // pseudo-destructor (a const member function, because 
    // even const objects may be destroyed) 
    void destroy() const { delete this; } // why this line is correct??? 

    ... 

private: 
    ~UPNumber(); 
}; 

首先,我相信上面的类定义是正确的。 这是我的问题,为什么我们可以像上面那样定义函数'destroy'? 被问到的原因是,我们为什么可以在const成员函数中修改'this'?

回答

4

应用于方法的const限定符具有使this传递给const指针的效果;特别是在你的情况下,它将是一个const UPNumber *

不过,这不是delete一个问题:其实你可以在const指针使用delete,而无需任何投,截至§5.3.5¶2规定:

[注:指针到const类型可以是delete-expression的操作数;在它被用作delete-expression的操作数之前,没有必要抛弃指针表达式的常量(5.2.11)。 ]

公告称,已完成标准之前,已经有关于这是否是或不是一个好主意,所以想deleteconst指针时一些预标准的编译器将发出错误很多讨论。

允许背后的想法这种行为,否则你就没有办法deleteconst对象,而不使用const_cast;有关更多信息,请参阅this question

10

这出于同样的原因,这项工作原理:

const int* upn = new int(); 
delete upn; 

您可以delete指向一个const限定对象。成员函数的常量限定意味着this的类型为const UPNumber*

+0

@詹姆斯,在这里,我们不能称之为“删除upn”b/c析构函数是私有的。 - thx – q0987 2011-02-28 23:34:50

+0

@ q0987:班级成员可以访问私人会员。因为'delete this'表达式,函数'destroy'需要访问析构函数,并且因为它是类的成员而具有访问权限。 – GManNickG 2011-02-28 23:51:26

+1

@GMan:我认为OP在抱怨我的例子,它最初使用'UPNumber'类而不是'int'。 – 2011-02-28 23:54:00

2

你从哪里得到我们正在修改this的想法?实际上,this不是一个左值。它不能修改,无论成员函数是否为const

删除表达式应用于指针(任何指针,而不仅仅是this)并不以任何方式被视为该指针的修改。此外,delete-expression的参数被视为右值,这意味着它不可能被delete修改。

因此,在代码中应用delete时没有问题。

+0

如果我明白你的观点正确,const成员函数只承诺不改变这个指向的值。 --thx – q0987 2011-02-28 23:42:33

+4

我认为除了需要说明的是,提问者错误地写了“为什么我们可以在const成员函数中修改'这个事实?”,尽管意思更像是“为什么我们可以通过*'this'修改对象*。不言而喻的假设是删除一个对象是一种修改形式(事实上,因为析构函数可以自由地修改成员)。 – 2011-02-28 23:55:37

0

由于它是技术上是可行的,并定义调用delete thisprovided that you are careful,在“自杀”方式的常量性是技术上没有意义,因为对象不能调用之后被触及。

这就是为什么它是语义不正确有一个const方法调用delete this

有趣的一点是Steve Jessep's comment。运行析构函数不会保持对象不变,因此应用const的概念是有问题的。

相关问题