C++隱式型別轉換運算子operator type()用法詳解
阿新 • • 發佈:2020-06-23
在閱讀<<C++標準庫>>的時候,在for_each()章節遇到下面程式碼,
#include "algostuff.hpp" class MeanValue{ private: long num; long sum; public: MeanValue():num(0),sum(0){ } void operator() (int elem){ num++; sum += elem; } operator double(){ return static_cast<double>(sum) / static_cast<double>(num); } }; int main() { std::vector<int> coll; INSERT_ELEMENTS(coll,1,8); double mv = for_each(coll.begin(),coll.end(),MeanValue()); //隱式型別轉換 MeanValue轉化為double std::cout<<"mean calue: "<< mv <<std::endl; }
對於類中的operator double(){},第一次見到這個特別的函式,其實他是"隱式型別轉換運算子",用於型別轉換用的.
在需要做資料型別轉換時,一般顯式的寫法是:
type1 i;
type2 d;
i = (type1)d; //顯式的寫型別轉,把d從type2型別轉為type1型別
這種寫法不能做到無縫轉換,也就是直接寫 i = d,而不需要顯式的寫(type1)來向編譯器表明型別轉換,要做到這點就需要“型別轉換操作符”,“型別轉換操作符”可以抽象的寫成如下形式:
operator type(){};
只要type是一個型別,包括基本資料型別,自己寫的類或者結構體都可以轉換。
隱式型別轉換運算子是一個特殊的成員函式:operator 關鍵字,其後跟一個型別符號。你不用定義函式的返回型別,因為返回型別就是這個函式的名字。
1.operator用於型別轉換函式:
型別轉換函式的特徵:
1) 型轉換函式定義在源類中;
2) 須由 operator 修飾,函式名稱是目標型別名或目標類名;
3) 函式沒有引數,沒有返回值,但是有return 語句,在return語句中返回目標型別資料或呼叫目標類的建構函式。
型別轉換函式主要有兩類:
1) 物件向基本資料型別轉換:
#include<iostream> #include<string> using namespace std; class D{ public: D(double d):d_(d) {} operator int() const{ std::cout<<"(int)d called!"<<std::endl; return static_cast<int>(d_); } private: double d_; }; int add(int a,int b){ return a+b; } int main(){ D d1=1.1; D d2=2.2; std::cout<<add(d1,d2)<<std::endl; system("pause"); return 0; }
2)物件向不同類的物件的轉換:
#include<iostream> class X; class A { public: A(int num=0):dat(num) {} A(const X& rhs):dat(rhs) {} operator int() {return dat;} private: int dat; }; class X { public: X(int num=0):dat(num) {} operator int() {return dat;} operator A(){ A temp=dat; return temp; } private: int dat; }; int main() { X stuff=37; A more=0; int hold; hold=stuff; std::cout<<hold<<std::endl; more=stuff; std::cout<<more<<std::endl; return 0; }
上面這個程式中X類通過“operator A()”型別轉換來實現將X型別物件轉換成A型別。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。