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

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

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

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)二義性與轉換目標為內置類型的多重類型轉換

這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 米脂县| 清水河县| 砀山县| 江源县| 常熟市| 阳曲县| 宜都市| 开阳县| 西昌市| 三门县| 察哈| 都江堰市| 威远县| 常山县| 太保市| 达尔| 连江县| 云南省| 米林县| 孟连| 呼伦贝尔市| 泌阳县| 寿阳县| 南康市| 嘉定区| 谷城县| 阿拉善盟| 全椒县| 太仓市| 班玛县| 马山县| 扶沟县| 民县| 隆子县| 祁门县| 聂拉木县| 顺平县| 莆田市| 平乡县| 科技| 固原市|