鱼C论坛

 找回密码
 立即注册
查看: 943|回复: 0

[技术交流] C++旅程第10站——类模板2

[复制链接]
发表于 2020-6-3 22:16:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 这是她 于 2020-6-4 20:20 编辑

Concern for someone else was a good remedy for taking the mind off one's own troubles.


类模板中成员函数创建时机


类模板中成员变量和普通类中成员函数创建时机区别:
1、普通类的成员函数一开始就可以创建
2、类模板的成员函数在调用时才创建
#include<iostream>

using namespace std;

class Student1
{
        public:
                void Showstudent1()
                {
                        cout << "Student1!!!!!!!!!!!!!!!!!" << endl;
                }
};

class Student2
{
        public:
                void Showstudent2()
                {
                        cout << "Student2!!!!!!!!!!!!!!!!!" << endl;
                }
};

template<class T>
class Class
{
        public:
        
                T a;
                
                //类模板中的成员函数并不是一开始就创建的,而是在模板调用的时在生成 
                
                void func1()
                {
                        a.Showstudent1();
                }        
                
                void func2()
                {
                        a.Showstudent2();
                }
};

void test1()
{
        //模板中的成员函数,比如fun1(),fun2(),只有在程序运行的时候才会被创建。
        
        Class<Student1> p1;
        p1.func1();
        p1.func2();//编译报错 --Student1类中没有func2()函数 
        
        Class<Student2> p2;
        p2.func1();//编译报错 --Student2类中没有func1()函数 
        p2.func2();
}

int main()
{
        test1();
        
        return 0;
} 
类模板对象做函数参数


传入方式:
1、指定传入的类型              ——直接显示对象的数据类型
2、参数模板化                    ——将对象中的参数变成模板进行传递
3、整个类模板化                 ——将这个对象类型模板化进行传递
#include<iostream>
#include<string>

using namespace std;

//定义一个模板类 
template<class T1,class T2>
class Person
{
        public:
                T1 m_name;
                T2 m_age;
                
                Person(T1 name,T2 age)
                {
                        this->m_name = name;
                        this->m_age = age;
                }
                
                void showperson()
                {
                        cout << "name : " << this->m_name << "  age : " << this->m_age << endl; 
                }
};

//1、指定传入类型 (常用) 
void Aperson(Person<string,int>&p)//传入引用 
{
        p.showperson();
} 

void test1()
{
        Person<string,int>p("猪头肉",100);
        Aperson(p);
}

//2、参数模板化
template<class T1,class T2>
void Bperson(Person<T1,T2>&p) 
{
        p.showperson();
}

void test2()
{
        Person<string,int>p("螺狮粉",90);
        Bperson(p);
}

//3、整个类模板化
template<class T>
void Cperson(T &p)
{
        p.showperson();
}

void test3()
{
        Person<string,int>p("烤猪蹄",80);
        Cperson(p);
}

int main()
{
        test1();
        
        test2();
        
        test3();
        
        return 0;
}

类模板与继承



当类模板碰到继承时,注意一下几点:
1、当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类的中T的类型
2、如果不指定,编译器无法给予子类分配内存
3、如果想灵活指定出父类中T的类型,子类也需变为类模板
#include<iostream>

using namespace std;

template<class T>
class Person
{
        public:
                T m;        
};

//class Person1 : public Person //错误  C++编译需要给子类分配内存,必须直到父类中T的类型才可以向下继承
class Person1 : public Person<int>//必须指定一个类型 
{
        
};

void test1()
{
        Person1 p1;
}

//如果想灵活指定父类中T类型,子类也需要变类模板 
template<class T1,class T2>
class Person2 : public Person<T2>
{
        public:
                T1 s;
};

void test2()
{
        Person2<int,char>p2;//int->T1  char->T2 父类中T 
}

int main()
{
        test1();
        
        test2();
        
        return 0;
}
                                                                  让我看看是谁再看

评分

参与人数 1荣誉 +1 鱼币 +5 贡献 +5 收起 理由
永恒的蓝色梦想 + 1 + 5 + 5 无条件支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 07:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表