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;}里的&代表什么。因为我在网上查找一些补充阅读的时候,大家似乎都没有加这个&,我也尝试过删除这个符号,运行似乎也没有啥问题。那么这个&到底代表什么,或者说改变了什么?有没有大神可以解读下。 表示返回一个引用 举例
#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);
会报错 好像是深浅拷贝问题 阳光肥肥 发表于 2021-11-8 21:21
表示返回一个引用 举例
#include
using namespace std;
多谢科普,个人理解就是,在你的例子里就相当于变量a和变量c完全相同,改变a就相当与改变c,有点类似与两个不同指针指向同一个地址。
d的意思呢就类似于新建一个变量,但是该变量的值等同于a的值。
不过我还是有点疑惑,因为在运算符重载的时候,就好比那个等于号重载,我感觉脑子就不够用了。我想不出返回引用和直接返回,在本质上有啥区别 和连续赋值与拷贝有关
https://blog.csdn.net/nice_wen/article/details/81637682 阳光肥肥 发表于 2021-11-9 15:19
和连续赋值与拷贝有关
https://blog.csdn.net/nice_wen/article/details/81637682
非常感谢,我感觉我懂了 你把int换成自定义的类型就明白了,返回引用会少调用一次拷贝构造,这意味着也会少调用一次析构,可以提升一些效率,实际上对于内置类型效率上是没有区别的(在VS编译器)。但是这不是最优做法。 链式编程比如a=b=c,返回引用可以链式编程,不返回引用第二个=号就不是原对象了。
页:
[1]