zoukankan      html  css  js  c++  java
  • 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修饰,那么不管类型相同或者不相同,都会调用构造函数模板.

  • 相关阅读:
    Docker容器(一):什么是Docker
    使用docker简单启动springboot项目
    nginx的alias与root的区别
    拦截器报循环依赖错误
    给jenkins更换工作空间
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    No Compiler is Provided in this environment Perhaps you are running on JRE rather than a JDK
    idea拉取最新代码弹窗(Ctrl + T)
    idea常用插件
    SqlDependency数据库缓存
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13691453.html
Copyright © 2011-2022 走看看