什么是运营商=回归?

时间:2014-10-17 03:21:46

标签: c++ reference

遇到了一个代码。我正在发布片段。

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; ? 我不明白这一点。

1 个答案:

答案 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地址da也是对a的引用,但我们不是仅仅为其分配c,而是取消引用指针this(完全等同于第二行)。想象一下c而不是d以及函数的返回值而不是return *this,并且您有operator=

一般说明:a = b = c 返回指定对象的引用,这是一个众所周知的习惯用法和有用的约定,因为它模仿了原始类型的行为。但是,像

这样的作业链接
Animal
如果按值返回(即Animal&而不是operator=),也可以

。但是,这会创建一个额外的副本(至少在理论上,如果编译器由于某种原因无法对其进行优化)。无论你怎么做,按值或引用返回都可以使上述语句成为可能,而返回指针却不行。如果Animal返回指向Animal*的指针,即{{1}},则您的班级用户会感到非常困惑。