1. 程式人生 > 程式設計 >C++隱式型別轉換運算子operator type()用法詳解

C++隱式型別轉換運算子operator type()用法詳解

在閱讀<<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型別。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。