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;
}

输出结果:

C++模板之成员模板和模板构造函数

加入构造函数模板:

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;
}

输出:

C++模板之成员模板和模板构造函数

这里可以发现,并没有调用构造函数模板,原因是在构造函数模板中,两个对象的类型不同,而这里的两个对象的类型相同,也就是实际想要调用的是构造函数。但是这里并没有定义构造函数,由于有成员变量,系统采用的是值初始化的方式,换句话说,也就是编译器实际上并没有为我们合成默认的构造函数,因为对于普通的成员变量而言,编译器内部有一定的规则,可以不用调用构造函数,对这些成员变量的初始化同样能够进行。所以这里显示的就是2了。

C++模板之成员模板和模板构造函数

如果把这里的const去掉,那么情况就会不一样,这是一条规则,如果没有const修饰,那么不管类型相同或者不相同,都会调用构造函数模板.

原文链接: https://www.cnblogs.com/SunShine-gzw/p/13691453.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/202936

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:20
下一篇 2023年2月12日 下午9:20

相关推荐