c++ - 运算符重载(对象添加)
问题描述
#include "stdafx.h"
#include "iostream"
using namespace std;
class complex
{
int real;
int img;
public:
complex(int x = 0, int y = 0)
{
cout << "Inside Prama" << endl;
real = x;
img = y;
}
complex operator+(complex x)
{
complex temp;
temp.real=real + x.real;
temp.img=img + x.img;
return temp;
}
void display()
{
cout << real << ' ' << img << endl;
}
};
int main()
{
class complex c1(5,6), c2(7,8),c3(7,7),c4;
c1.display();
c2.display();
c3.display();
c4 = c1+c2+c3;
c4.display();
return 0;
}
对于上述运算符重载代码,输出如下:
为什么在添加对象时调用参数化构造函数。我没有得到原因
解决方案
只是总结评论...
这里
complex operator+(complex x)
{
complex temp;
temp.real=real + x.real;
temp.img=img + x.img;
return temp;
}
complex temp;
调用构造函数,这就是你看到的输出。通常,您会x
作为const
参考传递以避免复制,但由于您需要一个副本,无论如何您都可以使用x
:
complex operator+(complex x)
{
x.real +=real;
x.img +=img;
return x;
}
这只会在您调用运算符时调用编译器生成的复制构造函数。
还有更多微妙之处需要考虑。使用x
而不是制作本地副本会禁止命名返回值优化。也很常见的实现operator+
,operator+=
然后operator+
可以是一个自由功能。请注意,这operator+=
可能更有效,因为根本不需要副本。有关运算符重载的更多详细信息,请参阅运算符重载的基本规则和惯用语是什么?
PS:“参数化构造函数”是迄今为止我只在糟糕的误导性教程中看到的术语。这不是一个官方术语。这里的相关术语是默认构造函数。complex(int x = 0, int y = 0)
是一个默认构造函数,因为它可以在没有参数的情况下调用。这是一个很好的例子,说明了为什么“参数化构造函数”没有传达很多含义并且相当具有误导性。
推荐阅读
- flutter-cupertino - Flutter CupertinoTabBar:无法通过流事件上的索引切换到选项卡
- java - 使用 WebClient 发送请求时重试“阻止”其他订阅者
- java - 领域驱动设计——每个实体都应该有指导吗?
- python - 如何通过变量将参数传递给函数?
- optix - OptiX 无法以足够的权限打开磁盘缓存
- react-native - 编辑 FlatList 的每个项目的状态
- python - 将 LXML 与 Html、Requests 和 ETree 一起使用,它会提供链接,但不会让我搜索特定文本的链接
- sql - 如何在 crudRepository 中创建方法以使用列表 ID 查找任何元素?
- java - 连接到 Mqtt 在线代理时出现 NullPointerException
- python - 如何在不关闭 Selenium 控制的浏览器的情况下接受键盘中断