目录
前言 为什么需要重载操作符?作用以及意义是什么?
一、如何实现
1.重载 + =
2.重载++
3.重载输入输出
4.重载=(深拷贝)
二、重载运算符应遵循的原则
总结
前言 为什么需要重载操作符?作用以及意义是什么?
操作符的重载可以让运算符作用于类类型的对象,而对于有些作用于对象的运算符,也可以在不改变含义的情况下自定义操作,那么为什么要这么做呢?很显然,它能非常方便地操作对象又不能保持其操作的含义明确。
重载运算符让运算符有新的语义,但绝对不是改变它的语法。
那么具体如何重载呢?
提示:以下是本篇文章正文内容,下面案例可供参考
一、如何实现
运算符重载函数的函数名由operator后面跟着要重载的运算符组成
格式如下
operatop( argument-list)
例如,operator+() 重载+运算符
operator*()重载*运算符
下面请看几个小实例,大致了解一下
1.重载 + =
#include
using namespace std;
class Num
{
private:
int m_Num;
public:
int GetNum() const;
int operator=(int n);
int operator+(int n);
public:
friend int operator+(int n, Num& num);
};
int Num::GetNum() const
{
return m_Num;
}
int Num::operator=(int n)
{
m_Num = n;
return m_Num;
}
int Num::operator+(int n)
{
return m_Num + 100;
}
int operator+(int n, Num& num)
{
return n + num.m_Num;
}
int main()
{
Num num1;
Num num2;
num2 = num1 = 100;
cout << num1.GetNum() << endl;
cout << num2.GetNum() << endl;
cout << num1 + 100 << endl;
cout << 100 + num1 << endl;
system("pause");
return 0;
}
2.重载++
#include
using namespace std;
//int operator++(int n) 表示后置形式
class Num
{
public:
int m_Num;
public:
Num()
{
m_Num = 100;
}
public:
int operator++(int n);
int operator++();
};
int Num::operator++(int n)
{
int nMark = m_Num;
m_Num++;
return nMark;
}
int Num::operator++()
{
return m_Num + 1;
}
int main()
{
Num num;
cout << num.m_Num << endl;
cout << num++ << endl;
cout << ++num << endl;
system("pause");
return 0;
}
3.重载输入输出
#include
using namespace std;
class Num
{
private:
int m_Num;
public:
friend istream& operator>>(istream& is, Num& num);
friend ostream& operator<<(ostream& os, Num& num);
};
istream& operator>>(istream& is, Num& num)
{
is >> num.m_Num;
return is;
}
ostream& operator<<(ostream& os, Num& num)
{
os << num.m_Num;
return os;
}
int main()
{
Num num;
cin >> num;
cout << num << endl;
return 0;
}
4.重载=(深拷贝)
#include
using namespace std;
class Num
{
public :
int* pNum;
public:
Num();
~Num();
void Show();
Num& operator=(Num& num);
};
Num::Num()
{
pNum = new int(100);
}
Num::~Num()
{
if (pNum != NULL)
{
delete pNum;
pNum = NULL;
}
}
void Num::Show()
{
cout << *pNum << endl;
}
Num& Num::operator=(Num& num)
{
if (this->pNum == NULL)
{
this->pNum = new int;
}
*this->pNum = *num.pNum;
return *this;
}
int main()
{
Num num1;
Num num2;
*num2.pNum = 200;
num1 = num2;
num1.Show();
num2.Show();
system("pause");
return 0;
}
#includeusing namespace std; //int operator++(int n) 表示后置形式 class Num { public: int m_Num; public: Num() { m_Num = 100; } public: int operator++(int n); int operator++(); }; int Num::operator++(int n) { int nMark = m_Num; m_Num++; return nMark; } int Num::operator++() { return m_Num + 1; } int main() { Num num; cout << num.m_Num << endl; cout << num++ << endl; cout << ++num << endl; system("pause"); return 0; }
3.重载输入输出
#include
using namespace std;
class Num
{
private:
int m_Num;
public:
friend istream& operator>>(istream& is, Num& num);
friend ostream& operator<<(ostream& os, Num& num);
};
istream& operator>>(istream& is, Num& num)
{
is >> num.m_Num;
return is;
}
ostream& operator<<(ostream& os, Num& num)
{
os << num.m_Num;
return os;
}
int main()
{
Num num;
cin >> num;
cout << num << endl;
return 0;
}
4.重载=(深拷贝)
#include
using namespace std;
class Num
{
public :
int* pNum;
public:
Num();
~Num();
void Show();
Num& operator=(Num& num);
};
Num::Num()
{
pNum = new int(100);
}
Num::~Num()
{
if (pNum != NULL)
{
delete pNum;
pNum = NULL;
}
}
void Num::Show()
{
cout << *pNum << endl;
}
Num& Num::operator=(Num& num)
{
if (this->pNum == NULL)
{
this->pNum = new int;
}
*this->pNum = *num.pNum;
return *this;
}
int main()
{
Num num1;
Num num2;
*num2.pNum = 200;
num1 = num2;
num1.Show();
num2.Show();
system("pause");
return 0;
}
#includeusing namespace std; class Num { public : int* pNum; public: Num(); ~Num(); void Show(); Num& operator=(Num& num); }; Num::Num() { pNum = new int(100); } Num::~Num() { if (pNum != NULL) { delete pNum; pNum = NULL; } } void Num::Show() { cout << *pNum << endl; } Num& Num::operator=(Num& num) { if (this->pNum == NULL) { this->pNum = new int; } *this->pNum = *num.pNum; return *this; } int main() { Num num1; Num num2; *num2.pNum = 200; num1 = num2; num1.Show(); num2.Show(); system("pause"); return 0; }
二、重载运算符应遵循的原则
重载的运算符本质来说是特殊的函数,因此它的参数数量应该和运算符作用的对象一样多,也就是说,一元运算符有一个参数,二元运算符有两个参数。
除此之外,最基本的要求是,重载的含义应该与运算符作用于内置类型时一样的含义。例如说,你不应该重载一个+,用于两个对象的的比较或者相减。
总结
(若放在类内实现就是类内的成员函数,若放在类外,和类无关,属于全局函数。)
篇幅有限,本文不对具体的运算符重载进行详细介绍,但至少对运算符的重载有基本的概念,了解之后,再去了解更多的特定运算符重载原则。
最后:不要滥用运算符重载。



