麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

函數調用運算符與重載、類型轉換

2019-11-14 09:13:07
字體:
來源:轉載
供稿:網友

函數調用運算符Operator() 函數運算符必須是成員函數。一個類可以定義多個不同版本的調用運算符,相互之間應該在參數數量或類型上有所區別。如果類定義了調用運算符,則該類的對象稱作函數對象。 函數對象類除了operator之外還可以包含其他成員。這些成員通常用于定制調用運算符中的操作。

#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表達式相當于一個類含有函數調用符的對象。

stable_sort(Words.begin(),words.end(),[](const string &a,const string &b){return a.size()<b.size()});等價于class shorterstring{public: bool operator()(const string &a,const string &b) const { return a.size()<b.size() }}

標準庫定義了一組表示算術運算符、關系運算符和邏輯運算符的類。這些類被定義成模板的形式。

這里寫圖片描述

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

C++語言有幾種可調用的對象:函數,函數指針,lambda表達式,bind創建的對象,重載的函數運算符的類。不同類型可能有相同的調用形式。在制作函數表的時候,我們可以利用function模板來實現不同類型而具有相同調用形式形成函數表。

#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},//加法,函數指針 {"%",mod},//求余,命名的lambda對象 {"/",Div()},//除法,函數對象類 {"-" ,std::minus<int>()},//減法,標準庫函數對象 {"*",[](int i,int j){return i*j;}}//乘法,未命名的lambda對象 };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;}

類型轉換運算符是類的一種特殊的成員函數,它負責將一個類類型的值轉換成其他類型。一個類型轉換函數必須是類的成員函數,它不能聲明返回類型,形參列表也必須為空。類轉換類型函數通常是const.

operator type() const;

類型轉換運算符可能產生意外的結果,C++11新標準引入了顯示的類型轉換運算符

class SmallInt{ explicit operator int() const{return val;}}SmallInt si=3;//正確si+3;//錯誤,需要隱式類型轉換,但類運算符是顯式的static_cast<int>(si)+3;//正確:顯式地請求類型轉換

向bool的類型轉換通常用在條件部分,因此operator bool一般定義成explicit.


如果類中包含一個或多個類型,則必須確保在類類型和目標類型之間只存在唯一一種轉換方式。 (1)實參匹配和相同的類型轉換

struct B;struct A{ A()=default; A(const B&);};struct B{ operator A() const; };A f(const A&);B b;A a=f(b);//二義性錯誤:f(B::operator A()) ?f(A::A(const B&))A a1=f(b.operator A());//正確:使用B的類型轉換運算符A a2=f(A(b));//正確:使用A的構造函數

(2)二義性與轉換目標為內置類型的多重類型轉換

這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 色阁五月 | 亚洲精品一区中文字幕 | 亚洲91精品 | 国产视频精品在线 | 五月天堂av91久久久 | 成人免费av在线播放 | 草操影院 | 激情亚洲网 | 日韩大片在线永久观看视频网站免费 | 嗯~啊~弄嗯~啊h高潮视频 | 永久av在线免费观看 | 国产精品欧美久久久久一区二区 | 337p粉嫩大胆噜噜噜亚瑟影院 | 欧美精品一区二区久久 | 日本高清黄色片 | 国产精品无码久久久久 | 99精品国产视频 | 蜜桃网在线观看 | 欧美一级网 | 中文字幕在线不卡视频 | 欧美一级黑人 | 久久99精品久久久久久秒播放器 | 一级做受毛片免费大片 | 宅男视频在线观看免费 | 久久精品高清 | 国产18视频 | 精品一区二区免费视频视频 | 国产精品免费观看视频 | 国产精品久久久久av | 午夜免费网 | 男女隐私免费视频 | 欧美性受xxx黑人xyx性爽 | 亚洲人成网站在e线播放 | 精品国产一区二区三区四区阿崩 | 成人在线视频黄色 | 久久艹逼 | 欧美一级α | 一级做a爱视频 | 欧美一级特黄a | 美女黄污视频 | 美女在线观看视频一区二区 |