遇到了一个代码。我正在发布片段。
Animal & Animal::operator=(const Animal & o) {
cout << "assignment operator" << endl;
if(this != &o) {
_type = o._type;
_name = clone_prefix + o._name;
_sound = o._sound;
}
return *this;
}
int main( int argc, char ** argv ) {
Animal a;
a.print();
const Animal b("goat", "bob", "baah");
b.print();
const Animal c = b;
c.print();
a = c;
a.print();
return 0;
我的问题:这是他指向当前对象的权利吗?赋值运算符返回Animal类型的对象吧?因为它正在返回*这个?但它不应该返回对象的地址,因为它的返回类型是Animal&amp; ? 我不明白这一点。
答案 0 :(得分:2)
operator=
会返回Animal&
,即对Animal
的引用。也许你的困惑源于&
也用于获取对象的地址,即产生指向对象的指针的事实。作为类型修饰符,它表示“引用”。所以*this
是正确的。
考虑一下这段代码:
Animal a{}; //suppose Animal has a default constructor
Animal& b = a;
Animal* c = &a;
Animal& d = *c;
a
是实际对象,而b
是对a
的引用(不是指针,因此a
位于右侧,而不是地址a
)。 c
是指向a
的指针,因此我们在右侧为a
分配&a
的地址。d
。 a
也是对a
的引用,但我们不是仅仅为其分配c
,而是取消引用指针this
(完全等同于第二行)。想象一下c
而不是d
以及函数的返回值而不是return *this
,并且您有operator=
。
一般说明:a = b = c
返回指定对象的引用,这是一个众所周知的习惯用法和有用的约定,因为它模仿了原始类型的行为。但是,像
Animal
如果按值返回(即Animal&
而不是operator=
),也可以。但是,这会创建一个额外的副本(至少在理论上,如果编译器由于某种原因无法对其进行优化)。无论你怎么做,按值或引用返回都可以使上述语句成为可能,而返回指针却不行。如果Animal
返回指向Animal*
的指针,即{{1}},则您的班级用户会感到非常困惑。