有人可以解释这段代码吗?我不明白第3行:
MyString MyString::operator+(const MyString &str)
{
MyString ss(*this); //----> explain this part
ss += str;
return ss;
}
谢谢!
答案 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
,它会按值返回新值并保持a
和b
不变,那么我们希望利用我们已经为复合运算符编写的代码。我们通过在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
是一个新字符串,它使用原始字符串中的复制构造函数构造。