C ++函数返回值作为引用并返回* this

时间:2010-09-20 18:42:23

标签: c++

如果我想从类成员函数返回“this”作为参考,那么这段代码是否正确?

Record& operator=(const Record& that) {
    m_name = that.m_name;
    return *this;
}

我不应该只使用“退回”吗?

感谢您的帮助:)

3 个答案:

答案 0 :(得分:8)

是的,这是正确的。

返回this无效,因为this是指针。 (它是一个指针而不是引用的原因是因为在类之前没有将引用引入语言。)

在这种特定情况下,如果您只是要分配成员,则不应编写复制赋值运算符;默认情况也是如此。当您管理某些资源(并调用Rule of Three)时,您需要使用copy-and-swap idiom

答案 1 :(得分:4)

您的代码是正确的,但您的评论shouldn't I just use "return this"是错误的(或者,更准确地说,答案是“不,您不应该,如果您尝试,任何编译器甚至可以正常工作编译器将停止你并给出一条错误信息。“)

给定一个类:

class T { 
    void X() {}
    void Y() const {}
};

T::X中,this的类型为T *const,而在T::Y中,this的类型为T const *const。无论哪种方式,它都是T的指针,而不是T的引用。要获得对T的引用(用于返回或任何其他目的),您需要使用{{1 }}

答案 2 :(得分:1)

对于这种特定情况可能无关紧要,但在复制赋值运算符中使用自我赋值保护是一种很好的做法。

Record& operator=(const Record& that) {
    if( &that != this ) {
        m_name = that.m_name;
    }
    return *this;
}

这可以防止像

这样的陈述
Record r;
// do something with r
r = r;     // this is protected

当类正在做一些资源(例如动态分配的内存)管理时,这很重要。