C++模板-34-类模板中成员函数的创建时机
这篇来学习下类模板中普通函数的创建时机。如果是普通的类的成员函数,在类的实例化对象创建过程中就可以创建成员函数。但是在类模板中,成员函数是不会里面创建。因为这里T这个类型如果没有被确定,成员函数是无法创建的,而是这个成员函数在调用的时候才被创建。下面使用代码来证明这个结论。
类模板中,成员函数是在被调用的时候才创建
代码如下
#include <iostream>
#include <string>
using namespace std;
class Person1
{
public:
void showPerson1()
{
cout << "Person1 show" << endl;
}
};
class Person2
{
public:
void showPerson2()
{
cout << "Person2 show" << endl;
}
};
//类模板
template <class T>
class myClass
{
public:
T obj;
// 类模板中的成员函数
void fun1()
{
obj.showPerson1();
}
void fun2()
{
obj.showPerson2();
}
};
int main()
{
//test01();
system("pause");
return 0;
}
这段代码是编译是没有问题,不会报错。来看看这个类模板myClass中有两个成员函数,第一个showPerson1() 一个showPerson2(). 但是对象obj 是T,还没有被确定是Person1对象还是Person2对象,所以当前在编译阶段这两个成员函数都没有报错。
接下来,如果我们在test01()中,确定T的类型是Person1,但是我们也想要调用showPerson2()这个成员函数,这个时候就会编译报错。
#include <iostream>
#include <string>
using namespace std;
class Person1
{
public:
void showPerson1()
{
cout << "Person1 show" << endl;
}
};
class Person2
{
public:
void showPerson2()
{
cout << "Person2 show" << endl;
}
};
//类模板
template <class T>
class myClass
{
public:
T obj;
// 类模板中的成员函数
void fun1()
{
obj.showPerson1();
}
void fun2()
{
obj.showPerson2();
}
};
void test01()
{
myClass<Person1> m;
m.fun1();
m.fun2();
}
int main()
{
test01();
system("pause");
return 0;
}
报错内容如下(在vs code软件下截图)
字面意思是,Person1这个类没有showPerson2这个成员函数,原因就是我们在test01中创建的m这个对象,已经确定是按照Person1这个类的类型创建,在50行我们就不能调用fun2()这个方法,注销这个方法就可以编译运行。
同理,如果在test01()函数中,我们创建类模板对象,参数确定是Person2类型的话,第49行m.fun1()也会报类似的错误。
还没有评论,来说两句吧...