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