C++用顶层函数重载操作符(二) 顶层函数的优势
C++ 函数 优势 重载 操作符 顶层
2023-09-14 09:09:31 时间
#include <iostream>
using namespace std;
class complex
{
public:
complex();
complex(double a);
complex(double a, double b);
double getreal() const { return real; }
double getimag() const { return imag; }
void setreal(double a){ real = a; }
void setimag(double b){ imag = b; }
void display()const;
private:
double real; //复数的实部
double imag; //复数的虚部
};
complex::complex()
{
real = 0.0;
imag = 0.0;
}
complex::complex(double a)
{
real = a;
imag = 0.0;
}
complex::complex(double a, double b)
{
real = a;
imag = b;
}
//打印复数
void complex::display()const
{
cout<<real<<" + "<<imag<<" i ";
}
//重载加法操作符
complex operator+(const complex & A, const complex &B)
{
complex C;
C.setreal(A.getreal() + B.getreal());
C.setimag(A.getimag() + B.getimag());
return C;
}
//重载减法操作符
complex operator-(const complex & A, const complex &B)
{
complex C;
C.setreal(A.getreal() - B.getreal());
C.setimag(A.getimag() - B.getimag());
return C;
}
//重载乘法操作符
complex operator*(const complex & A, const complex &B)
{
complex C;
C.setreal(A.getreal() * B.getreal() - A.getimag() * B.getimag() );
C.setimag(A.getimag() * B.getreal() + A.getreal() * B.getimag() );
return C;
}
//重载除法操作符
complex operator/(const complex & A, const complex & B)
{
complex C;
double square = B.getreal() * B.getreal() + B.getimag() * B.getimag();
C.setreal((A.getreal() * B.getreal() + A.getimag() * B.getimag())/square);
C.setimag((A.getimag() * B.getreal() - A.getreal() * B.getimag())/square);
return C;
}
int main()
{
complex c1,c3, c2(15.5, 23.1);
c1 = c2 + 13.5;
c1.display();
cout<<endl;
c1 = 13.5 + c2;
c1.display();
cout<<endl;
c3=c2/2;
c3.display();
cout<<endl;
c3=c2*2;
c3.display();
cout<<endl;
return 0;
}
29 + 23.1 i
29 + 23.1 i
7.75 + 11.55 i
31 + 46.2 i
这个例子是以顶层函数的形式定义操作符重载函数。我们同样来看主函数,其中定义了 c1 和 c2 两个 complex 类对象。先来看一下语句c1 = c2 + 13.5;,这个语句可以理解如下:
c1 = operator+(c2, 13.5);
因为我们在顶层函数中定义了complex operator+(const complex & A, const complex &B)函数,系统在执行c1 = operator+(c2, 13.5);时找到了对应的顶层函数,虽然参数不对,但可以通过类的构造函数将 13.5 转换成 complex 类对象,如此就满足 operator+() 函数的调用条件了,故而这一句是没有问题的
我们再来看一下语句c1 = 13.5 + c2;,这一语句可以理解为:
c1 = operator+(13.5, c2);
这一句的执行与c1 = operator+(c2, 13.5);是一样的,它可以利用类的构造函数将 13.5 转换为 complex 类对象,因此这一句也是可以正确执行的。
我们不难体会出以顶层函数形式重载操作符的优势。总结一下,以类成员函数的形式进行操作符重载,操作符左侧的操作数必须为类对象;而以顶层函数的形式进行操作符重载,只要类中定义了相应的转型构造函数,操作符左侧或右侧的操作数均可以不是类对象,但其中必须至少有一个类对象,否则调用的就是系统内建的操作符而非自己定义的操作符重载函数了。
相关文章
- C++ 类
- 进一步理解C++中的堆(Heap)
- (C++)虚函数表解析(转)
- 【IOS-COCOS2D-X 游戏开发之十四】XCODE中C++&OBJECT-C混编,详细介绍如何在COCOS2DX中访问OBJECT函数以及APPLE API
- c++ template归纳学习5
- C++查缺补漏3,赶紧的
- C语言/C++常见习题问答集锦(六十六) 之x对应y的函数值与Nim取子游戏博弈论
- c++模板学习04之普通函数与模板函数调用规则
- paip.函数方法回调机制跟java php python c++的实现
- C++:C++编程语言学习之函数/结构体和类的简介、案例应用之详细攻略
- C++构造函数和析构函数
- 【面试攻略】C++面试-IGG
- 【华为OD机试 2023】农场施肥 不爱施肥的小布(C++ Java JavaScript Python)
- C++每日扎心结构体之初始化导致的一次异常崩溃。
- C++ 11 学习总结——智能指针
- std string与线程安全_这才是现代C++单例模式简单又安全的实现
- Effective C++ Item 36 绝不又一次定义继承而来的 non-virtual 函数
- C++之非const引用无法绑定临时变量原因(一百一三十六)
- C++ 排序函数 sort(),qsort()的使用方法
- 如何使用C++回调函数
- 官宣:新版Azure SDK for C++ 测试版本发布
- C/C++之宏、内联函数和普通函数的区别
- VC++CopyFile函数的用法
- C/C++经典面试题二
- 【C++】算法集锦(2):递归精讲
- C/C++调用java---JNI常用函数