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()也会报类似的错误。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值