c++函数模板具体化和实例化 (c++定义在类里面的模板函数)

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

然后我们再来看类模板中成员函数的创建时机是什么时候

可以看到,普通类中的成员函数一开始就可以创建了,

类模板中的成员函数在调用时才创建.

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

我们写个例子看看,可以看到我们写了一个Person1类,然后

里面有个showPerson1方法

然后里面只有一个输出语句

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

然后我们再去写一个Person2这类,然后

也写一个showPerson2这个方法.

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

然后我们再去写一个类模板

MyClass 然后,里面只有一个属性 T obj

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

然后我们再去写两个成成员函数,在这个类模板中,可以看到,我们直接写了一个

func1,一个func2,然后在func1,中调用了

obj.showPerson1()方法,在func2中调用了obj.showPerson2()方法

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

可以看到上面我们给类模板中定义了,两个成员函数然后编译,可以看到编译成功了

说明什么,没报错,就不会去创建对应的T的对象.所以不报错.也就是说

T这个类模板,没有被调用,所以没报错对吧,因为我们现在看的话,T都不知道是什么

如果编译阶段他就去调用执行的话,肯定是报错的,没报错,就说明他没有执行.

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

然后我们去写一个test01方法

然后里面去,声明一个类模板MyClass的对象,可以看到,这个类模板中参数对象是Person1

然后我们用m去调用m.func1,和m.func2这两个函数,可以知道

调用m.func2,肯定会报错,因为我们传入的Person1这个类,根本没有func2这个函数对吧.

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

可以看到执行的时候也确实是报错了,是因为m.func2,调用showPerson2的时候,报错的

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

可以看到我们类模板中,有个func2函数,调用了

obj.showPerson2的函数对吧

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

我们删除了m.func2以后,然后我们再编译

看一看的没问题了对吧

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

然后我们执行看结果,没问题对吧去看看

也显示出来了Person1 show的,Person1中打印出来的内容

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

然后我们再去把Person2,替换到MyClass类模板中

然后这里我们如果调用m.func1的话,编译会报错的

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

可以看到报错了,因为我们Person2类中,是有showPerson2函数的

没有showPerson1函数对吧,而这里m.func1,调用的是showPerson1,所以就报错了.

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

这里我们改成m.func2这样我们再去执行

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

可以看到就不报错了对吧

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

c++定义在类里面的模板函数,如何看懂c++模板的构造函数

所以,类模板中的成员函数并不是一开始就创建的,而是在调用的时候,才去创建的.