函數(shù)調(diào)用運(yùn)算符:Operator() 函數(shù)運(yùn)算符必須是成員函數(shù)。一個(gè)類(lèi)可以定義多個(gè)不同版本的調(diào)用運(yùn)算符,相互之間應(yīng)該在參數(shù)數(shù)量或類(lèi)型上有所區(qū)別。如果類(lèi)定義了調(diào)用運(yùn)算符,則該類(lèi)的對(duì)象稱(chēng)作函數(shù)對(duì)象。 函數(shù)對(duì)象類(lèi)除了operator之外還可以包含其他成員。這些成員通常用于定制調(diào)用運(yùn)算符中的操作。
#include <iostream>#include <string>class A{public: int operator()(bool a,int b,int c) const { if(a) return b; else return c; }};class GetInput{public: GetInput(std::istream &i=std::cin):is(i){} std::string operator()()const { std::string str; std::getline(is,str); return is?str:std::string(); }PRivate: std::istream &is;};int main(){ A a; int ret=a(0,7,8); std::cout<<ret<<std::endl; GetInput gi; std::cout<<gi()<<std::endl; return 0;}lambda表達(dá)式相當(dāng)于一個(gè)類(lèi)含有函數(shù)調(diào)用符的對(duì)象。
stable_sort(Words.begin(),words.end(),[](const string &a,const string &b){return a.size()<b.size()});等價(jià)于class shorterstring{public: bool operator()(const string &a,const string &b) const { return a.size()<b.size() }}標(biāo)準(zhǔn)庫(kù)定義了一組表示算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符的類(lèi)。這些類(lèi)被定義成模板的形式。
C++語(yǔ)言有幾種可調(diào)用的對(duì)象:函數(shù),函數(shù)指針,lambda表達(dá)式,bind創(chuàng)建的對(duì)象,重載的函數(shù)運(yùn)算符的類(lèi)。不同類(lèi)型可能有相同的調(diào)用形式。在制作函數(shù)表的時(shí)候,我們可以利用function模板來(lái)實(shí)現(xiàn)不同類(lèi)型而具有相同調(diào)用形式形成函數(shù)表。
#include <functional>#include <iostream>#include <map>#include <string>int add(int i,int j){return i+j;}auto mod=[](int i,int j){return i%j;}; struct Div{ int operator ()(int i, int j) const { return i / j; } };auto binops=std::map<std::string,std::function<int(int,int)>>{ {"+",add},//加法,函數(shù)指針 {"%",mod},//求余,命名的lambda對(duì)象 {"/",Div()},//除法,函數(shù)對(duì)象類(lèi) {"-" ,std::minus<int>()},//減法,標(biāo)準(zhǔn)庫(kù)函數(shù)對(duì)象 {"*",[](int i,int j){return i*j;}}//乘法,未命名的lambda對(duì)象 };int main(){ while ( std::cout << "Pls enter as: num operator num :/n", true ) { int lhs, rhs; std::string op; std::cin >> lhs >> op >> rhs; std::cout << binops[op](lhs, rhs) << std::endl; } return 0;}類(lèi)型轉(zhuǎn)換運(yùn)算符是類(lèi)的一種特殊的成員函數(shù),它負(fù)責(zé)將一個(gè)類(lèi)類(lèi)型的值轉(zhuǎn)換成其他類(lèi)型。一個(gè)類(lèi)型轉(zhuǎn)換函數(shù)必須是類(lèi)的成員函數(shù),它不能聲明返回類(lèi)型,形參列表也必須為空。類(lèi)轉(zhuǎn)換類(lèi)型函數(shù)通常是const.
operator type() const;類(lèi)型轉(zhuǎn)換運(yùn)算符可能產(chǎn)生意外的結(jié)果,C++11新標(biāo)準(zhǔn)引入了顯示的類(lèi)型轉(zhuǎn)換運(yùn)算符
class SmallInt{ explicit operator int() const{return val;}}SmallInt si=3;//正確si+3;//錯(cuò)誤,需要隱式類(lèi)型轉(zhuǎn)換,但類(lèi)運(yùn)算符是顯式的static_cast<int>(si)+3;//正確:顯式地請(qǐng)求類(lèi)型轉(zhuǎn)換向bool的類(lèi)型轉(zhuǎn)換通常用在條件部分,因此operator bool一般定義成explicit.
如果類(lèi)中包含一個(gè)或多個(gè)類(lèi)型,則必須確保在類(lèi)類(lèi)型和目標(biāo)類(lèi)型之間只存在唯一一種轉(zhuǎn)換方式。 (1)實(shí)參匹配和相同的類(lèi)型轉(zhuǎn)換
struct B;struct A{ A()=default; A(const B&);};struct B{ operator A() const; };A f(const A&);B b;A a=f(b);//二義性錯(cuò)誤:f(B::operator A()) ?f(A::A(const B&))A a1=f(b.operator A());//正確:使用B的類(lèi)型轉(zhuǎn)換運(yùn)算符A a2=f(A(b));//正確:使用A的構(gòu)造函數(shù)(2)二義性與轉(zhuǎn)換目標(biāo)為內(nèi)置類(lèi)型的多重類(lèi)型轉(zhuǎn)換
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注