C++primer閱讀筆記-----------重載運算與類型轉換

該博客用於記錄自己在閱讀過程中不懂的知識點,很少用到但比較重要的知識點以及模棱兩可的知識點


含有混合類型的對稱性運算符的重載一般定義爲普通非成員函數


string s1 = s + “aa”; //正確
string s1 = “aa” + s; //如果operator+是成員函數則錯誤,因爲此時等價 於“aa”.operator+(s)

輸入輸出符必須是非成員函數

如果類定義了調用運算符,則稱該類對象爲函數對象:
class PrintString{
public:
PrintString(ostream &o = cout, char c = ' '):os(o), sep(c){}
void operator() (const string &s) const {os << s << sep}
private:
ostream &os;
char sep;
}
for_each(vs.begin(), vs.end(), PrintString(cerr, '\n'));

標準庫定義的函數對象:
sort(vec.begin(), vec.end(), greater<string>());
形如greater<type>這樣的函數對象還有許多

可調用對象大致有:函數,函數指針,lamda表達式,bind創建的對象,重載了函數調用運算符的類

使用可調用對象時,不免會考慮如何存放多個相同調用方式的可調用方式,此時爲們需要一張函數表,可以用map實現:
map<string, function<int (int, int)>> binops = {
{“+”, add},
{“-”, std::minus<int>()},
//可以存放函數指針,函數對象,lamda表達式等
}
binops[“+”](10, 5); //調用方式

類型轉換運算符必須是成員函數,形式:
operator int() const {return val}; //將類類型轉換爲int類型

顯式的類型轉換符:
explicit operator int() const {return val};
通常搭配static_cast使用,但有個例外,如果表達式出現在條件中(if,while,for等(有時使用一個輸入作爲判斷條件就是這個原理))或者邏輯運算符以及條件運算符(? :)中,則會忽略explicit,依然執行隱式的類型轉換

二異性:
class B;
class A{
A() = default;
A(const B&);
}

class B{
operator A() const;
}
A fun(const A&);
B b;
A a = fun(b); //參數類型爲A,可以使用B中的類型轉換運算符將b轉換爲 A類型,也可以使用A中以B類型爲參數的構造函數

還有源類型之間可以互相轉換的類型轉換可能產生二異性
class A{
A (int);
A(double);
}
long num;
A a(num); //二異性錯誤
同樣目標類型也會存在這種隱患



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章