1. 程式人生 > >C++自動類型轉化--特殊構造函數方法和重載的運算符方法

C++自動類型轉化--特殊構造函數方法和重載的運算符方法

allow pub tdi exp 阻止 stdio.h public stream esp

一、重載運算符法

#include <stdio.h>
#include <iostream>

class Three
{
    int i;
public:
    Three(int ii = 0, int = 0) : i(ii) 
    {
        std::cout << "you call Three()" << std::endl;
    }
};


class Four
{
    int x;
public:
    Four(int xx) : x(xx) {}
    operator Three() const
{ return Three(x);} }; void g(Three) {} int main() { Four four(1); g(four); g(1);//calls Three(1,0) int n; std::cin >> n; }
//輸出兩次:
you call Three()


2.構造函數轉換

//這個構造函數能夠把另一類型的對象(引用)作為它的單個參數,那麽構造函數允許編譯器執行自動類型轉換;
#include <stdio.h> #include <iostream> class One { public
: One() {} }; class Two { public: Two(const One&) { std::cout << "you call Two()" << std::endl; } }; void f(Two) {} int main() { One one; f(one);//wants a Two ,has a one
//輸出:
"you call Two()”
    int i;
    std::cin >> i;
}
註意:以上方法調用了Two的隱藏的構造函數,如果關心調用效率的話不要這樣使用!

3.阻止構造函數被隱式調用,要求必須顯示調用:

//使用關鍵詞explicit時,必須顯示調用,完成類型轉換
#include <stdio.h> #include <iostream> using namespace std; class One { public: One() { } }; class Two { public: explicit Two(const One&) {} }; void f(Two) {} int main() { One one; //!f(one);//NO auto conversion allowed f(Two(one)); //int i; //cin >> i; }

C++自動類型轉化--特殊構造函數方法和重載的運算符方法