C++类模板

目录

语法:

类模板和函数模板的区别:

普通类和类模板的成员函数创建时机:

类模板与继承:

类模板成员函数类外实现:

类模板的分文件实现:

类模板的友元实现:

语法:

template<typename T>

类模板和函数模板的区别:

1.类模板没有自动类型推导的使用方式

2.类模板在模板参数列表中可以有默认参数(在c++11之后函数模块也可以有默认参数了)

#include <iostream>
#include <string>

using namespace std;


//类模板
template<typename nameType,typename ageType>
class Person{
public:
    Person(nameType name,ageType age=int)  //age默认参数类型为int
    {
        this->m_name=name;
        this->m_age=age;
    }
    void showPerson()
    {
        cout<<"name:"<<this->m_name<<" age:"<<this->m_age<<endl;
    }
    nameType m_name;
    ageType m_age;

};

int main()
{
    //Person p1("张三",25);错误,无法自动类型推导
    Person<string,int> p1("张三",25);
    p1.showPerson();

    Person<string> p1("李四",26);
    p1.showPerson();
    return 0;
}

普通类和类模板的成员函数创建时机:

1.普通类中的成员一开始就被创建

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

类模板与继承:

示例(非完整):

#include <iostream>
using namespace std;


template<typename T>
class Father{
public:
    T m;
};

//必须要指定父类中的T类型,才可以继承
class Son1:public Father<int>{


};


//或者灵活指定父类中的T类型
template<typename T1,typename T2>
class Son2:public Father<T2>{

public:
    T1 obj;

};

类模板成员函数类外实现:

示例(非完整):

#include <iostream>
#include <string>
using namespace std;


template<typename T1,typename T2>
class Person{
public:
    Person(T1 name,T2 age);

    void showPerson()
    {
        cout<<"姓名:"<<this->m_Name<<" 年龄:"<<this->m_Age<<endl;
    }
    T1 m_Name;
    T2 m_Age;
};

//构造函数类外实现
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
    this->m_Name=name;
    this->m_Age=age;
}

类模板的分文件实现

person.h文件

#pragam once
#include <iostream>
#include <string>
using namespace std;


template<typename T1,typename T2>
class Person{
public:
    Person(T1 name,T2 age);

    void showPerson();

    T1 m_Name;
    T2 m_Age;
};

person.cpp文件

#include "person.h"


//构造函数类外实现
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
    this->m_Name=name;
    this->m_Age=age;
}

template<typename T1,typename T2>
void Person<T1,T2>::showPerson()
{
    cout<<"姓名:"<<this->m_Name<<" 年龄:"<< this->m_Age<<endl;
}

1.main中调用的时候,直接包含源文件,即在main.cpp中 #include "person.cpp"(不推荐这个方法)

2.将.h和.cpp的内容写在一起,将后缀改为.hpp文件,在main.cpp文件中引入#include "person.hpp"

person.h --> person.hpp

#pragam once
#include <iostream>
#include <string>
using namespace std;


template<typename T1,typename T2>
class Person{
public:
    Person(T1 name,T2 age);

    void showPerson();
    T1 m_Name;
    T2 m_Age;
};


//构造函数类外实现
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
    this->m_Name=name;
    this->m_Age=age;
}

template<typename T1,typename T2>
void Person<T1,T2>::showPerson()
{
    cout<<"姓名:"<<this->m_Name<<" 年龄:"<< this->m_Age<<endl;
}

类模板的友元实现:

1.全局函数类内实现,直接在类内声明友元

2.全局函数类外实现,要提前让编译器知道该函数的存在

#include <iostream>
#include <string>
using namespace std;


//------全局函数类外实现需要------
template<typename T1,typename T2>
class Person;

template<typename T1,typename T2>
void showPerson2(Person<T1,T2> P);
{
    cout<<"姓名:"<<P.m_Name<<" 年龄:"<< P.m_Age<<endl;
}
//------全局函数类外实现需要------



template<typename T1,typename T2>
class Person{
    //全局函数类内实现
     friend void showPerson(Person<T1,T2> P)
    {
        cout<<"姓名:"<<P.m_Name<<" 年龄:"<< P.m_Age<<endl;
    }
    
    //全局函数类外实现
    //加空模板参数列表,且要让编译器提前知道有这个函数的存在
     friend void showPerson2<>(Person<T1,T2> P);

public:
    Person(T1 name,T2 age)
    {
        this->m_Name=name;
        this->m_Age=age;
    }


private:
    T1 m_Name;
    T2 m_Age;
};



int main(){
    Person<string,int> p("jane",25);
    showPerson(p);


    Person<string,int> p2("TOM",25);
    showPerson2(p2);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值