[Effective C++]条款10:令operator= 返回一个reference to *this

在C++的赋值操作符operator= 通常需要返回一个当前对象的引用,有以下原因:

1、支持链式赋值

  • 返回*this的引用允许进行链式赋值操作。
  • 如下代码中,b=c会返回b的引用,然后a=(b=c)会继续使用这个引用来赋值给a,如果operator= 不返回引用,链式赋值将无法正常工作。
    a = b = c;

2、保持一致性

  • C++标准库中的许多类和内置类型(int,double等)的赋值操作符都返回引用为了保持一致性,用户自定义类型的赋值操作符,最好也返回引用。
  • int基本数据类型的赋值操作福=,是由编译器直接实现,没有显示的源码实现,底层对应一条机器指令(mov指令)

3、避免不必要的拷贝

  • 如果operator= 的返回值不是引用,那么在赋值操作完成后,会生成一个临时对象并返回它,导致不必要的拷贝操作
class MyClass {
public:
    MyClass(int value) : data(value) {}

    // 错误的 operator= 实现,返回值而不是引用
    MyClass operator=(const MyClass& other) {
        if (this != &other) {
            data = other.data;
        }
        return *this;
    }

    int getData() const { return data; }

private:
    int data;
};

上述代码进行链式赋值操作:

  • b=c会返回一个MyClass的临时对象,而不是b的引用。然后a=(b=c)会使用这个临时对象来赋值给a
  • 这不仅会导致不必要的拷贝
  • 还会导致a和b 的值不一致,因为a实际上是被赋值为一个临时对象,而不是b的引用。
    MyClass a(1), b(2), c(3);
    a = b = c;
    正确实现:
class MyClass {
public:
    MyClass(int value) : data(value) {}

    // 正确的 operator= 实现,返回引用
    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            data = other.data;
        }
        return *this;
    }

    int getData() const { return data; }

private:
    int data;
};

** 4、this 与 *this **

  • C++中,this指针是一个指向当前对象的指针,他是一个隐含的指针,在类的成员函数中,this->data和data是等价的,都表示当前对象的成员变量。
  • *this 是对this指针的解引用,表示当前对象本身的值。

思维导图笔记
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值