运算符重载什么时候不用引用

本文介绍了运算符重载的概念,如如何在C++中实现自定义类的加法操作符,以及为何运算符重载函数不能引用局部变量,强调了返回值类型和参数选择的重要性。

1、首先运算符重载是什么?

答:其实运算符重载就是将运算符重新设定的功能;比如输出整个类时,可以重载过后就可以直接输出。如图,输出可以直接写:cout<<lucy+bob;就可以直接输出整个类。

Person operator +(Person ob,Person ob1)
{
    Person tmp;
    tmp.num=ob.num+ob1.num;
    tmp.name=ob.name+ob1.name;
    tmp.score=ob.score+ob1.score;
    return tmp;
}
int main(int argc, char *argv[])
{

    Person ob(1,"lucy",99.8f);
    Person ob1(2,"bob",99.9f);


    cout<<ob+ob1;
    cout<<ob<<ob1;

    return 0;
}

2、为什么不能引用局部变量的引用

答:随着程序的运行,局部变量会随着函数运行结束而释放。

因此,返回局部变量时,运算符重载的函数返回值不能用&,那么传型参时,就要类型一致,也不能用引用。

所以,在写运算符重载函数时运算符重载函数返回值类型,型参尽量不要用引用。

C++ 中,赋值运算符重载返回引用的主要原因是为了支持连续赋值的场景。赋值运算符的结合性是从右往左的,这意味着在一个连续赋值表达式中,如 `d1 = d2 = d3;`,首先执行的是 `d2 = d3` 的赋值操作,然后将 `d2` 的值作为右操作数用于 `d1 = d2` 的赋值操作。为了实现这种行为,赋值运算符重载函数需要返回当前对象的引用,这样可以确保赋值操作的结果可以直接作为另一个赋值操作的右操作数[^2]。 此外,返回引用还可以提高效率。当返回一个对象的引用时,不会触发拷贝构造函数来创建一个新的临时对象,而是直接返回现有对象的引用。这减少了不必要的对象拷贝,从而提升了程序的性能[^2]。 下面是一个简单的例子,展示了如何在 C++ 中实现赋值运算符重载并返回当前对象的引用: ```cpp class Data { public: Data(int year, int month, int day) { _year = year; _month = month; _day = day; } // 返回值类型 Data& 表示返回当前对象的引用 Data& operator=(const Data& d) { // d1 = d2, 即将 d2 的值赋给 d1 _year = d._year; _month = d._month; _day = d._day; // 返回当前对象的引用,以便支持连续赋值 return *this; } void Print() { std::cout << _year << "/" << _month << "/" << _day << std::endl; } private: int _year; int _month; int _day; }; int main() { Data d1(2022, 3, 11); Data d2(2028, 5, 24); Data d3(2026, 6, 20); d1 = d2 = d3; // d1.operator=(d2.operator=(d3)); d1.Print(); // 输出 d1 的值,应该是 d3 的值 return 0; } ``` 在这个例子中,`Data` 类的赋值运算符重载函数返回了当前对象的引用 `*this`,使得可以进行连续赋值操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值