C++模板之成員模板和模板構造函數


namespace myspace6
{
    template<typename T1>
    class TC
    {
    public:
        template<typename T2>
        TC(T2 v1, T2 v2)
        {
            cout << "TC(T2 v1,T2 V2)被執行了" << endl;
        }
        
        TC(T1 v1,T1 v2)
        {
            cout << "TC(T1 v1,T1 v2)被執行了" << endl;
        }

        TC(double v1, double v2)
        {
            cout << "TC(double v1, double v2)被執行了" << endl;
        }
    };
}

int main(int argc, char** argv[])
{

    myspace6::TC<float> one(1,2);
    myspace6::TC<float> two(11.1f,12.3f);
    myspace6::TC<float> three(1.1,2.4);
    while (1);
    return 0;
}

輸出結果:

 

 

加入構造函數模板:

namespace myspace6
{
    template<typename T1>
    class TC
    {

    private:
        T1 data;

    public:

        template<typename U>
        TC(const TC<U>&)
        {
            cout << "構造函數模板被執行了" << endl;
        }

        void getData()
        {
            cout << "data=" << data << endl;
        }

        void SetData(T1 x)
        {
            data = x;
        }

        template<typename T2>
        TC(T2 v1, T2 v2)
        {
            cout << "TC(T2 v1,T2 V2)被執行了" << endl;
        }
        
        TC(T1 v1,T1 v2)
        {
            cout << "TC(T1 v1,T1 v2)被執行了" << endl;
        }

        TC(double v1, double v2)
        {
            cout << "TC(double v1, double v2)被執行了" << endl;
        }
    };
}

int main(int argc, char** argv[])
{

    myspace6::TC<float> one(1,2);
    myspace6::TC<float> two(11.1f,12.3f);
    myspace6::TC<float> three(1.1,2.4);
    
    three.SetData(2);

    myspace6::TC<float> four(three);
    four.getData();

    while (1);
    return 0;
}

輸出:

 

 

 

這里可以發現,並沒有調用構造函數模板,原因是在構造函數模板中,兩個對象的類型不同,而這里的兩個對象的類型相同,也就是實際想要調用的是構造函數。但是這里並沒有定義構造函數,由於有成員變量,系統采用的是值初始化的方式,換句話說,也就是編譯器實際上並沒有為我們合成默認的構造函數,因為對於普通的成員變量而言,編譯器內部有一定的規則,可以不用調用構造函數,對這些成員變量的初始化同樣能夠進行。所以這里顯示的就是2了。

 

 

 

 

如果把這里的const去掉,那么情況就會不一樣,這是一條規則,如果沒有const修飾,那么不管類型相同或者不相同,都會調用構造函數模板.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM