c++运算符重载
#include <iostream>
#include <string>
using namespace std;
class A
{
//使用友元函数实现运算符重载,要在形参中指出所有参数,并且注意返回值的类型一边不用引用了
friend A operator - (const A &a, const A &b);
//如果是这种写法:friend A& operator - (const A &a, const A &b);
//由于两个const的对象不能当作返回值,并且如果在函数中写了个保存结果的临时变量,这个临时变量又会在函数结束时销毁
//导致返回不正确,有如果你在函数中new了一个对象,或者malloc了一个对象,但是这个对象你又要记得销毁,这又是常常容易忘记的
//综上只要是使用友元函数实现的运算符重载,那么就返回一个对象,不用引用。
//只要是在函数内部实现的运算符重载,那么就返回引用对象,一般是返回*this
public:
string name;
int id;
A()
{
this->name = "hello";
this->id = 0;
}
//在函数中实现运算符重载,会默认将this当作一个变量
A& operator = (const A &a)
{
this->name = a.name;
this->id = a.id;
return *this;
}
A& operator + (const A &a)
{
this->id+a.id;
return *this;
}
};
A operator-(const A &a, const A &b) {
A t;
t.id = a.id-b.id;
return t;
}
A func()
{
A a;
a.name = "shadaoi";
a.id = 123;
return a;
}
int main()
{
A b;
cout<<b.name<<endl;
cout<<b.id<<endl;
b = func();
cout<<b.name<<endl;
cout<<b.id<<endl;
return 0;
}
比较运算符重载:
参考博客:https://blog.csdn.net/qq_36583051/article/details/122185372
不写友元函数的话有可能会出现下面这种报错:
ERROR:C2678 二进制“<”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)
错误代码:
#include <map>
#include <string>
struct Section
{
int id;
std::string code;
bool operator<(const Section& rhs)
{
return id < rhs.id;
}
};
int main()
{
std::map<Section, std::string> stdMap;
stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));
stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));
stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));
return 0;
}
错误原因:
由于调用了这种需要调用比较运算的STL (Standard Template Library的缩写,中文译为“标准模板库)
编译器限定,运算符“<”内部只需读取对象成员变量,体现出大小比较的原则即可,禁止对成员变量进行修改。
所以,重载运算符“<”的实现必须要求const限定。
如果你仅仅声明stdMap,而不去insert他也不会报错。
正确写法:
#include <map>
#include <string>
struct Section
{
int id;
std::string code;
#if 1
// 方案一:重载运算符<
bool operator<(const Section & rhs) const // 注意:第二个const
{
return id < rhs.id;
}
#else
// 方案二:提供运算符<的友元函数
friend bool operator<(Section const& lhs, Section const& rhs)
{
return lhs.id < rhs.id;
}
#endif
};
int main()
{
std::map<Section, std::string> stdMap;
stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));
stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));
stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));
return 0;
}