c++运算符重载
先给出一段代码,具体函数内容会在下面给出:
class Person{
public:
Person(){}
bool operator==(Person &p);//重载"=="
bool operator!=(Person &p);//重载"!="
Person &operator++();//前置++重载
Person operator++(int);//后置++重载
friend ostream &operator<<(ostream &out, const Person p);//重载"<<"
friend istream &operator>>(istream &in, Person &p);//重载">>"
int get_Age();
private:
string m_name;
int m_age;
};
一、基本概念
重载运算符是具有特殊名字的函数。
二、函数名字组成
关键字operator和其后要定义的运算符号共同组成;同样也包含返回类型、参数列表以及函数体。
三、常用运算符重载示例
1.重载输入输出运算符>>、<<
注意事项:
输入输出运算符必须是非成员函数。
输入运算符必须处理输入可能失败的情况。
输入运算符重载函数的参数必须加引用。
"<<"重载:
ostream &operator<<(ostream &out, const Person p){
out << p.m_age;
return out;
}
">>"重载:
istream &operator>>(istream &in, Person &p){
cout << "姓名:";
in >> p.m_name;
cout << "年龄:";
in >> p.m_age;
return in;
}
2.重载运算符==和!=
"=="重载
bool Person::operator==(Person &p){
return this->m_age == p.m_age && this->m_name == p.m_name;
}
"!="重载
bool Person::operator!=(Person &p){
return !(this->m_age == p.m_age && this->m_name == p.m_name);
}
3.赋值运算符=重载
注意事项:
赋值运算符必须定义为成员函数。
重载的赋值运算符必须先释放当前内存空间,再创建一片新空间。
Class &Class::operator=(Class &obj)
4. 复合赋值运算符重载
可以是非成员函数也可以是成员函数
Class &Class::operator+=(Class &obj)
...
5.下标运算符[ ]的重载
注意事项:
下标运算符必须是成员函数。
最好同时定义下标运算符的常量版本和非常量版本,当作用域一个常量对象时,下标运算符返回常量引用以确保我们不会给返回的对象赋值。
6.递增和递减运算符重载
注意事项:
应同时定义前置版本和后置版本。
为了区分前置和后置,后置版本接受一个额外的(不被使用)int类型的实参。
前置运算符应该返回递增或递减后对象的引用。
后置运算符应该返回递增或递减后对象的原值。
前置"++"重载
Person &Person::operator++(){
this->m_age++;
return *this;
}
后置"++"重载
Person Person::operator++(int){
Person ret = *this;
++m_age;
return ret;
}
代码测试
#include <iostream>
using namespace std;
#include <string>
class Person{
public:
Person(){}
bool operator==(Person &p);
bool operator!=(Person &p);
Person &operator++();//前置++重载
Person operator++(int);//后置++重载
friend ostream &operator<<(ostream &out, const Person p);
friend istream &operator>>(istream &in, Person &p);
int get_Age();
private:
string m_name;
int m_age;
};
int Person::get_Age(){
return m_age;
}
bool Person::operator==(Person &p){
return this->m_age == p.m_age && this->m_name == p.m_name;
}
bool Person::operator!=(Person &p){
return !(this->m_age == p.m_age && this->m_name == p.m_name);
}
ostream &operator<<(ostream &out, const Person p){
out << p.m_age;
return out;
}
istream &operator>>(istream &in, Person &p){
cout << "姓名:";
in >> p.m_name;
cout << "年龄:";
in >> p.m_age;
return in;
}
Person &Person::operator++(){
this->m_age++;
return *this;
}
Person Person::operator++(int){
Person ret = *this;
++m_age;
return ret;
}
int main()
{
Person p1, p2;
cout << "p1:" << endl;
cin >> p1;
cout << "p2:" << endl;
cin >> p2;
if(p1 == p2){
cout << "p1和p2相同" << endl;
}else{
cout << "p1和p2不相同" << endl;
}
cout << ++(++p1) << endl;
cout << p2++ << endl;
cout << p2 << endl;
return 0;
}