在const成员函数中用this初始化非const指针

时间:2014-08-08 07:47:01

标签: c++ pointers

如果链接列表实现具有类Link

class Link {
public:
    string value;
    // constructor etc.
    Link* insert(Link* n);
    // other member functions
    Link* advance(int n) const;
private:
    // ...    
}

在const成员函数Link* advance(int n) const中,我希望通过列表中的n元素前进并获得指向该元素的指针。为此,我想用this指针初始化一个指针:

Link* Link::advance(int n) const {
    if (this==0) return 0;
    Link* p = this;
    // do stuff with p
    return p;
}

这不起作用,因为Link* p = this;正在尝试使用Link*初始化const Link*。但是,如果我将其更改为const Link* p = this;,则return p;会返回错误的类型。

我认为函数应该是const,因为它不会改变任何东西,但我也希望它返回一个非const指针,因为我想用它来修改列表中的元素。是否有比丑陋更好的方式,比如

Link* Link::advance(int n) const {
    if (this==0) return 0;
    const Link* p = this;
    // do stuff with p
    return const_cast<Link*>(p);
}

实现这个目标?

1 个答案:

答案 0 :(得分:2)

如果你想修改链表中的元素,那么该函数首先不应该是const,因为const函数是基于你没有修改数据的事实。您传入的对象(如果该链接列表,它也适用于列表的任何后续成员)。您也不应泄漏允许修改类的对象,例如返回对象内元素的指针或引用。

如果你真的想修改这个函数中列表的内容,那么使函数非常量。如果您希望出于实际原因const的函数(传递const值),那么请使用const的第二个变体并且不会修改内容(并返回const Link*)。