天天看點

c++Primer——第十四章:重載運算與類型轉換

1、對于一個運算符函數來說,它或者是類的成員或者至少含有一個類類型的參數。

2、不能被重載的運算符

::        .*        .        ?:

而通常情況下,不應該被重載的運算符

,        &        &&        ||

3、當我們把運算符定義成成員函數時。它的左側運算對象必須是運算符所屬類的一個對象

// 假定 + 是string的成員
string s = "world";
string t = s + "!";		//正确 相當于 s.operator+("!")
string u = "hi" + s;   //錯誤  相當于 "hi".operator+(s), "hi"是個const char*,一種内置類型 沒有成員
           

4、輸入輸出運算符必須是非成員函數

5、前置遞增、遞減運算符傳回遞增遞減後的對象引用。後置遞增、遞減運算符傳回遞增遞減前的原值,注意傳回的是值不是引用。

6、對箭頭運算符重載的限定

我們在重載大多數運算符時,可以令它們完成任何我們想要完成的事情。而箭頭(->)運算符則不然,在重載->運算符時可以改變的是從哪個對象擷取成員,而箭頭擷取成員這一事實則永遠不變。且重載的箭頭運算符必須傳回類的指針或者傳回一些定義了箭頭運算符的某個類的對象。

7、lambda

當我們編寫了一個lambda表達式後,編譯器将該表達式翻譯成一個未命名類的未命名對象。在lambda表達式産生的類中含有一個重載的函數調用運算符,但是不含預設構造函數、指派運算符及預設析構函數,是否含有預設的拷貝、移動構造函數則通常要視捕獲的資料成員類型而定。

8、可調用對象與std::function

9、類型轉換運算符

  • 編譯器一次隻能執行一個使用者定義的類型轉換
  • 類型轉換運算符是隐式執行的
  • 類型轉換函數不能指定傳回類型,但實際上每個類型轉換函數都會傳回一個對應類型的值
class SmallInt
{
public:
	SmallInt(int i = 0) :val(i)
	{
		if (i < 0 || i>255)
			throw std::out_of_range("Bad SmallInt value");
	}
	//類型轉換運算符
	operator int() const{ return val; }
private:
	std::size_t val;
};

void test()
{
	SmallInt si;
	si = 4; // 先将4隐式轉換為SmallInt 再調用SmallInt::operator=
	si + 3; // 先将si隐式的轉換為int 再執行+
}
           

10、顯示的類型轉換運算符(explicit限定)

當類型轉換運算符是顯示的時,必須通過顯示的強制類型轉換(如:static_cast)才能使用,但也有例外:如果表達式被用作條件,編譯器會将顯示的類型轉換自動應用于它,即顯示的類型轉換被隐式的執行。

繼續閱讀