国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

函數(shù)調(diào)用運(yùn)算符與重載、類(lèi)型轉(zhuǎn)換

2019-11-14 09:52:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

函數(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)被定義成模板的形式。

這里寫(xiě)圖片描述

#include <iostream>#include <functional>int main(){ std::plus<int> intadd; int sum=intadd(10,20); std::cout<<sum; return 0;}

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)換

這里寫(xiě)圖片描述


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 赤壁市| 元谋县| 淮阳县| 周口市| 临桂县| 秦安县| 甘德县| 神池县| 社会| 宜宾县| 曲阜市| 会东县| 无棣县| 沂源县| 宁国市| 肥乡县| 苏尼特左旗| 嵩明县| 泗阳县| 汉源县| 格尔木市| 寿宁县| 筠连县| 石阡县| 广德县| 怀安县| 衡水市| 吴江市| 沧源| 运城市| 子洲县| 舒城县| 泾川县| 新蔡县| 嘉义市| 新昌县| 会同县| 宣威市| 儋州市| 金昌市| 湖南省|