運(yùn)算符重載
運(yùn)算符重載的概念
在C++中,基本的算數(shù)運(yùn)算符,如果不做特殊處理,則 不能用于對象之間的運(yùn)算 。
運(yùn)算符重載的目的:使得C++中的運(yùn)算符也能夠 用來操作對象 。
用于類運(yùn)算的運(yùn)算符通常都要重載。有兩個運(yùn)算符,系統(tǒng)提供了默認(rèn)的重載版本:賦值運(yùn)算符 = 和 地址運(yùn)算符 $
與其他函數(shù)一樣,重載運(yùn)算符有一個返回類型和一個參數(shù)列表。這樣的函數(shù)被稱為 運(yùn)算符函數(shù) 。
運(yùn)算符可以被重載為 全局函數(shù) ,也可以被重載為 類的成員函數(shù) 。
聲明為全局函數(shù)時,通常應(yīng)是 類的友元 。
運(yùn)算符函數(shù)是一種特殊的 友元函數(shù) 或 全局函數(shù) 。
不可重載的運(yùn)算符和符號
| 名稱 | |
|---|---|
| 成員訪問運(yùn)算符 | . |
| 成員指針訪問運(yùn)算符 |
. *、-> *
|
| 域運(yùn)算符 | :: |
| 長度運(yùn)算符 | sizeof |
| 條件運(yùn)算符 | ?: |
| 預(yù)處理符號 | # |
重載運(yùn)算符的規(guī)則
- 重載后的運(yùn)算符的含義應(yīng)該 符合原有的用法習(xí)慣 ;
- 運(yùn)算符重載 不能改變 運(yùn)算符原有的含義;
- 運(yùn)算符重載 不能改變 運(yùn)算符操作數(shù)的個數(shù)及語法結(jié)構(gòu);
- 運(yùn)算符重載 不能改變 運(yùn)算符用于基本數(shù)據(jù)類型對象的含義;
- 不能創(chuàng)建新的運(yùn)算符;
- 重載運(yùn)算符
()、[]、->、=時,只能將它們重載為 成員函數(shù) ,不能重載為全局函數(shù)。
重載運(yùn)算符為類的成員函數(shù)
定義和聲明:
class 類名
{
private:
類型 成員變量;
public:
類型 opeartor 運(yùn)算符 (參數(shù)列表);
};
類型 類名::opeartor 運(yùn)算符 (參數(shù)列表)
{
函數(shù)體
};
運(yùn)算符執(zhí)行時,C++編譯器解析:
對象名.opeartor 運(yùn)算符 (參數(shù)列表);
重載運(yùn)算符為友元函數(shù)
定義和聲明:
class 類名
{
private:
類型 成員變量;
public:
friend 類型 opeartor 運(yùn)算符 (參數(shù)列表);
};
類型 opeartor 運(yùn)算符 (參數(shù)列表)
{
函數(shù)體
};
運(yùn)算符執(zhí)行時,C++編譯器解析:
opeartor 運(yùn)算符 (參數(shù)列表);
重載賦值運(yùn)算符
C++規(guī)定,賦值運(yùn)算符 = 只能被重載為成員函數(shù)。
若有類CL的兩個對象s1和s2,則它們之間的賦值語句通常是下面的形式:
s1 = s2;
當(dāng)類CL重載了賦值運(yùn)算符后,則上述語句被解釋為 函數(shù)調(diào)用 的形式:
s1.opeartor=(s2);
淺拷貝和深拷貝
同類對象之間可以通過賦值運(yùn)算符 = 互相賦值。如果沒有經(jīng)過重載,= 的作用就是將賦值號右側(cè)對象的值一一賦值給左側(cè)的對象 。這相當(dāng)于值的拷貝,稱為 淺拷貝 。
重載賦值運(yùn)算符后,賦值語句的功能是將 一個對象中指針成員變量指向的內(nèi)容復(fù)制到另一個對象中指針成員變量指向的地方 ,這樣的拷貝叫做 深拷貝 。
重載流插入運(yùn)算符和流提取運(yùn)算符
必須重載為友元函數(shù) 。
#include <iostream>
using namespace std;
class Test
{
private:
int a;
int b;
public:
friend ostream & opeartor<< (ostream &, Test);
friend istream & opeartor>> (istream &, Test);
};
ostream & opeartor<< (ostream & o_stream, Test obj)
{
o_stream << obj.a << endl;
o_stream << obj.b << endl;
return o_stream;
}
istream & opeartor>> (istream & i_stream, Test obj)
{
i_stream >> obj.a;
i_stream >> obj.b;
return i_stream;
}
重載自增、自減運(yùn)算符
按照自增、自減運(yùn)算符的本來定義,++obj 的返回值應(yīng)該是 obj被修改后的值 ,而 obj++ 的返回值應(yīng)該是 obj被修改前的值 。
class 類名
{
private:
int i;
public:
// 成員函數(shù) - 前置形式
類型 opeartor ++ ();
// 成員函數(shù) - 后置形式
類型 opeartor ++ (int);
// 友元函數(shù) - 前置形式
friend 類型 opeartor -- (類名引用);
// 友元函數(shù) - 后置形式
friend 類型 opeartor -- (類名引用, int);
};
類型 類名::opeartor ++ () {};
類型 類名::opeartor ++ (int) {};
類型 opeartor -- (類名引用) {};
類型 opeartor -- (類名引用, int) {};
重載強(qiáng)制類型轉(zhuǎn)換運(yùn)算符
強(qiáng)制類型轉(zhuǎn)換運(yùn)算符是單目運(yùn)算符,也可以被重載, 但只能重載為成員函數(shù) 。
class 類名
{
private:
類型 成員變量;
public:
opeartor 類型名 ();
};
經(jīng)過適當(dāng)?shù)闹剌d后,(類型名)對象; 轉(zhuǎn)換為 對象.opeartor 類型名 ();