模板类Copy函数的声明
方式1 与 方式2 只能出现一个否则报错
方式1
class A {
public:
A() {
}
A(const A& a) {
cout << "A copy " << endl;
}
A& operator=(const A& a) {
cout << "A operator = " << endl;
}
};
方式2
class A {
public:
A() {
}
A(const A<T>& a) {
cout << "A copy 1" << endl;
}
A<T>& operator=(const A<T>& a) {
cout << "A operator = " << endl;
}
};
模板拷贝函数与拷贝函数
首先先确认构造函数是模板类的构造函数。模板构造函数只是一个模板函数。这俩个听起来很相似但不是一回事,即使有模板构造函数它也不能代替模板类的
template <class T>
class A {
public:
A() {
}
A(const A& a) {
cout << "A copy " << endl;
}
template <class T2>
A(const A<T2>& a) {
cout << "A copy 2" << endl;
}
};
int main() {
A<int> a;
A<int> b(a);
A<double> c(a);
return 0;
}
output:
A copy
A copy 2
如上的demo,当类型相同拷贝时会调真正的拷贝构造函数,类型不同时才调用模板实现的构造函数,那么我们试试没有声明构造函数会发生什么
template <class T>
class A {
public:
A() {
}
template <class T2>
A(const A<T2>& a) {
cout << "A copy 2" << endl;
}
};
int main() {
A<int> a;
A<int> b(a);
A<double> c(a);
return 0;
}
output:
A copy 2
使用了编译器自己生成的默认构造函数,可见俩个不是一回事。以上列子适用于 operator=函数。