geleisisisi 发表于 2021-11-8 20:56

C++运算符重载中&符号的使用疑问

最近在学C++里的class,然后遇到了运算符重载的问题,以下是老师写的代码:
#include <iostream>
using namespace std;

class Thing{
        int* value;
public:
        Thing(int newVal = 0):value(new int(newVal)){}
        void print(){cout<<*this->value;}
        ~Thing(){delete value;}//destructor
        Thing(const Thing& rhs){value = new int(*rhs.value);}//copy constructor
        Thing& operator=(const Thing& rhs){*value = *rhs.value;return *this;}//assignment op
       
};

int main(){
        Thing one(1);
        Thing two(2);
        one = two;
        one.print();
}

由于有指针的存在,所以重新定义了下两个object相等后该如何运算,但是我不明白的是运算符重载的时候,那个Thing& operator=(const Thing& rhs){*value = *rhs.value;return *this;}里的&代表什么。因为我在网上查找一些补充阅读的时候,大家似乎都没有加这个&,我也尝试过删除这个符号,运行似乎也没有啥问题。那么这个&到底代表什么,或者说改变了什么?有没有大神可以解读下。

阳光肥肥 发表于 2021-11-8 21:21

表示返回一个引用 举例
#include<iostream>
using namespace std;

int &Foo1(int &a);
int Foo2(int &a);
int main() {

    int a = 3;
    cout << "a的地址是:" << &a << endl;
    int &c = Foo1(a);
    int d = Foo2(a);
    cout << "c的地址是:" << &c << endl;
    cout << "d的地址是:" << &d << endl;
    return 0;
}

int &Foo1(int &a) {
    return a;
}
int Foo2(int &a) {
    return a;
}
结果会显示a和c的地址相同,d不同,且d在声明时不能声明为
int & d = Foo2(a);
会报错

sam喵喵 发表于 2021-11-8 22:17

好像是深浅拷贝问题

geleisisisi 发表于 2021-11-9 11:23

阳光肥肥 发表于 2021-11-8 21:21
表示返回一个引用 举例
#include
using namespace std;


多谢科普,个人理解就是,在你的例子里就相当于变量a和变量c完全相同,改变a就相当与改变c,有点类似与两个不同指针指向同一个地址。
d的意思呢就类似于新建一个变量,但是该变量的值等同于a的值。
不过我还是有点疑惑,因为在运算符重载的时候,就好比那个等于号重载,我感觉脑子就不够用了。我想不出返回引用和直接返回,在本质上有啥区别

阳光肥肥 发表于 2021-11-9 15:19

和连续赋值与拷贝有关
https://blog.csdn.net/nice_wen/article/details/81637682

geleisisisi 发表于 2021-11-9 17:41

阳光肥肥 发表于 2021-11-9 15:19
和连续赋值与拷贝有关
https://blog.csdn.net/nice_wen/article/details/81637682

非常感谢,我感觉我懂了

ESMGAL 发表于 2021-11-12 13:55

你把int换成自定义的类型就明白了,返回引用会少调用一次拷贝构造,这意味着也会少调用一次析构,可以提升一些效率,实际上对于内置类型效率上是没有区别的(在VS编译器)。但是这不是最优做法。

qinghuashouwang 发表于 2021-11-14 20:12

链式编程比如a=b=c,返回引用可以链式编程,不返回引用第二个=号就不是原对象了。
页: [1]
查看完整版本: C++运算符重载中&符号的使用疑问