吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 921|回复: 7
收起左侧

[求助] C++运算符重载中&符号的使用疑问

[复制链接]
geleisisisi 发表于 2021-11-8 20:56
最近在学C++里的class,然后遇到了运算符重载的问题,以下是老师写的代码:
[C++] 纯文本查看 复制代码
#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
表示返回一个引用 举例
[C++] 纯文本查看 复制代码
#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
表示返回一个引用 举例
[mw_shl_code=cpp,true]#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,返回引用可以链式编程,不返回引用第二个=号就不是原对象了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表