1. 程式人生 > >C++學習之建構函式的理解--模板形式的建構函式不會遮掩編譯器生成的預設建構函式

C++學習之建構函式的理解--模板形式的建構函式不會遮掩編譯器生成的預設建構函式

我們都知道編譯器會為我們定義預設的空引數建構函式和複製建構函式,其實複製建構函式和一般的帶引數的建構函式的區別也就僅僅在與此(我認為),也就是在不顯示定義複製建構函式的時候,系統會為我們合成一個預設的複製建構函式。

1.定義一般的建構函式時,系統還是會為我們生成一個預設的複製建構函式,但是當定義了複製建構函式的時候系統就不再為我們定義預設的空引數建構函式,如下程式碼,將出現語法錯誤:

class m{
public:
        m(const m&){
        }
};
m m1;
2.(不考慮實際應用價值)當定義模板形式的一般建構函式的時候,系統還是會為我們定義一個預設的空引數建構函式,如下:
class test{
public:
        template<typename t1,typename t2>
        test(t1 var1,t2 var2){
                std::cout<<"two params"<<std::endl;
        }
};
        test a();//ok
        test b(1,"test");
        test c=b;
    test t(1,2);
    test t1;//error


3.當定義模板形式的複製建構函式的時候,系統還是會為我們定義一個預設的複製建構函式,但是不在提供預設的空引數建構函式,如下,去掉自己定義的空引數建構函式會編譯出錯:

template <typename t>
class test1{
public:
        test1(){}
        template<typename t1>
        test1(const test1<t1>&){
                std::cout<<"defined"<<std::endl;
        }
};
        test1<int> t1,t2;
        test1<int>t4=t1;
        std::cout<<"------"<<std::endl;
        test1<std::string>t3;
        test1<int>t5=t3;
輸出為:

------
defined

可見預設的複製建構函式還是存在,並沒有被定義的模板形式的複製建構函式遮掩。
賦值操作符同上。

其實這是函式模板的例項化機制影響的。

參見:Effective C++ 條款45