今天看《Effective C++》,發現了一個一直不懂的技巧,就是定義一個類在進行類型轉換後的結果,例如我有一個這樣的類:
class Sum2Int { int a,b;public: explicit sum2Int(int aa, int bb) : a(aa), b(bb) {}};
如果我希望它可以轉換成int的時候,得到的結果是a+b,應該怎麼做?我以前的做法都是在類裡面另外定義一個成員函數,例如叫get()之類的,如下:
class Sum2Int { int a,b;public: explicit Sum2Int(int aa, int bb) : a(aa), b(bb) {} int get() { return a+b; }};
這樣可以達到目的,但是有點繁瑣,如果有一個函數是:void print(int num),那麼在傳遞參數的時候,我就必須寫print(Sum2Int(2,1).get())。這樣做也有好處,就是別人知道這個類有這麼一個函數可以返回一個int值。不過現在說說新的方法,請參見以下代碼:
#include<iostream>using namespace std;class Sum2Int { int a,b;public: explicit Sum2Int(int aa, int bb) : a(aa), b(bb) {} operator int() const { return a+b; } operator double() const { return 1.0*a + 1.0*b; } int get() { return a+b; }};void prt(int k) { cout<<k<<endl;}void prt2(double k){ cout<<k<<endl;}int main(){ int a,b; while(true) { cin>>a>>b; prt(Sum2Int(a,b)); prt2(Sum2Int(a,b)); cout<<Sum2Int(a,b).get()<<endl; }}
在進行參數傳遞的時候,(我估計但不確定)編譯器會嘗試對類實行類型轉換,如果重載了類型轉換,那麼就可以直接轉換成功。這麼做的用處有什麼呢?其實就是方便……要考慮有很多資源管理類會對資源進行封裝,資源本身被保護在資源管理類中,但有時候你要活得原始的資源,可能就需要用類似get()這樣的函數,但是有些情境下可能導致頻繁地使用get()等函數,因此這個時候重載一下類型轉換是個不錯的選擇()
這個方法來自《Effective C++》的條款15。這本書相當不錯,尤其是一些程式設計的思想,會有讓人“啊哦!”的感覺
如果文中哪裡有問題,還請指出~!