一、operator做類的轉換函數
類可使用構造函數將其餘類型轉化爲此類的對象,好比ios
my_class a = my_class(int i);
1
將int型轉化爲my_class類的一個對象。函數
一樣,也可使用類的轉換函數將類的對象轉化爲其餘的類型。
類的轉換函數應當知足如下的幾個條件:spa
轉換函數必須是類方法
轉換函數不能指定返回類型
轉換函數不能有參數對象
下面是一個類轉化函數的例子ci
#include <iostream>get
using namespace std;編譯器
class my_class
{
public:
operator int()//定義了一個將類轉化爲int的轉換函數
{
cout << "convert_to_int" << endl;
return 1;
}
};it
int main()
{
my_class a;
int i_a = (int)a;//第一次顯式的轉換
cout << a << endl;//第二次隱式的轉換io
return 0;
}
最終的輸出結果以下: 編譯
固然也能夠轉化爲任意其餘的類型,只須要改變轉換函數便可。
可是在定義轉化函數時,要避免出現二義性,好比不要同時提供多個符合條件的轉換函數:
#include <iostream>
using namespace std;
class my_class
{
public:
operator double()//定義了一個將類轉化爲double的轉換函數
{
cout << "convert_to_double" << endl;
return 1.1;
}
operator int()//定義了一個將類轉化爲int的轉換函數
{
cout << "convert_to_int" << endl;
return 1;
}
};
int main()
{
my_class a;
cout << a << endl;//報錯
return 0;
}
在VS上獲得以下的報錯信息:
有多個運算符 "<<" 與這些操做數匹配
1
固然,若同時須要這兩個轉換函數,這個錯誤也能夠經過不少方法來解決,好比顯式的指定要輸出的是哪一種類型,而不是讓編譯器本身去選擇:
cout << (double)a << endl;
1
或者指定其中一個轉換函數只能顯式的轉換,而不能隱式的轉換
explicit operator double()
{
cout << "convert_to_double" << endl;
return 1.1;
}
都將獲得正確的結果。
二、operator在類中重載運算符
重載與類型轉換雖然使用的是同一個關鍵字,但它們在形式上仍是有很大的差異的:
類型轉換:operator <類型>()
運算符重載:<類型> operator <運算符>(<參數表>)
重載主要有兩種形式,成員函數形式與友元函數形式。下面舉個例子:
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass() {}
MyClass(int a, double b):a_(a),b_(b){}
~MyClass(){}
int get_a() { return a_; }
double get_b() { return b_; }
MyClass operator+(const MyClass &adder) const//以成員函數方式重載+
{
MyClass sum;
sum.a_ = a_ + adder.a_;
sum.b_ = b_ + adder.b_;
return sum;
}
friend MyClass operator-(const MyClass &A,const MyClass &B)//以友元方式重載-
{
MyClass diff;
diff.a_ = A.a_ - B.a_;
diff.b_ = A.b_ - B.b_;
return diff;
}
private:
int a_;
double b_;
};
int main()
{
MyClass A(1, 1.1);
MyClass B(2, 2.2);
MyClass sum = A + B;
MyClass diff = A - B;
cout << sum.get_a() << "\t" << sum.get_b() << endl;
cout << diff.get_a() << "\t" << diff.get_b() << endl;
return 0; } 程序的運行結果: