令人困惑的C ++代码涉及* this?

时间:2011-08-10 22:11:22

标签: c++ operator-overloading this

有人可以解释这段代码吗?我不明白第3行:

MyString MyString::operator+(const MyString &str)
{
    MyString ss(*this); //----> explain this part
    ss += str;
    return ss;
}

谢谢!

5 个答案:

答案 0 :(得分:11)

此代码:

MyString ss(*this);

表示“声明一个名为MyString的{​​{1}}类型的新变量,并将其初始化为ss的副本。”在成员函数内部,*this是指向接收者对象(成员函数正在作用的对象)的指针,因此this是对接收者对象的引用。因此,您可以将其视为“创建一个名为*this的新MyString,并且是接收者对象的副本。”

此处使用的习惯用法ss正在实施operator +。想法是制作接收器对象的副本,使用operator +=将参数添加到副本,然后返回副本。这是一种广泛使用的技巧,它简化了独立运算符的实现,并实现了相应的复合赋值运算符。

希望这有帮助!

答案 1 :(得分:3)

这是公共代码重用技术的一个实例,用于实现另一个运算符。

假设我们已经定义了一个复合运算符:

class X
{
  X & operator+=(const X&);
};

这个一元运算符允许我们编写a += b,它修改a并返回对自身的引用。这一切都很好,很好。现在,如果我们还想提供复制,二进制加操作符a + b,它会按值返回新值并保持ab不变,那么我们希望利用我们已经为复合运算符编写的代码。我们通过在a临时副本上调用一元运算符来实现此目的:

X X::operator+(const X & b) const { return X(*this) += b; }
                                           ^^^^^^^^
                                           temporary copy

这正是你的代码所做的,只是更加冗长。你也可以写return MyString(*this) += str;

还有其他习惯遵循相似的精神,例如在const访问方面实现非const访问,在复制构造和交换方面实现copy-assign,以及在move-construct和swap方面实现move-assign 。它总是归结为避免代码重复。

答案 2 :(得分:1)

它是MyString的构造函数,它将当前对象(类型为MyString)的值作为其参数。

答案 3 :(得分:1)

据我所知,这是一个复制构造函数,它使用当前MyString对象的内容创建一个新的MyString。

答案 4 :(得分:1)

ss是一个新字符串,它使用原始字符串中的复制构造函数构造。

相关问题