首页 > 编程语言 >C++温故补缺(十三):模板

C++温故补缺(十三):模板

时间:2023-03-20 23:23:07浏览次数:45  
标签:return name C++ tp student 温故 public 模板

C++模板

模板是泛型的基础,泛型编程就是一种独立于任何特殊类型的方式编写代码。模板就是创建泛型类或泛型函数的蓝图。STL库中的几个数据结构(vector,list,map等)以及算法都使用了泛型。

函数模板

格式:template <typename type> return-type function-name(parameter list){//函数体}

模板用到的关键字是template,其后跟的就是后续可以指定的模板类型,return-type是返回值类型,后面是函数名和参数列表,和普通函数别无二致。

就是多了template关键字和一个可以后续修改的模板类型

例子:

#include<iostream>
using namespace std;

template <typename T> T Max(T x,T y){
    return x<y?y:x;
}
int main(){
    int a=12,b=15;
    float a1=1.2,b1=1.5;
    cout<<Max(a,b)<<endl;
    cout<<Max(a1,b1)<<endl;
}

如上,Max函数可以作用于不同的类型的参数,它会根据参数的类型自动转换模板类型T的类型,T只是一个名字,用来标志模板的类型。

函数的参数以及返回值也是可以为T类型。

T的类型在传参时会自动确定,但也可以显式指定类型:Max<int>()

类模板

格式:template <class type> class class-name{};

类似于函数模板,<class type>就是用来定义类模板的,后续可以指定为不同的类型

例子:

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

class people{
    protected:
        string name;
    public:
        people(){name="";}
        people(string name){this->name=name;}
};
class student:public people{
    protected:
        int sno;
    public:
        student(){sno=-1;}
        student(int no,string name):people(name){sno=no;}
        int getno(){return sno;}
        string getname(){return name;}
};
class teacher:public student{
    public:
        teacher(int no,string name):student(no,name){}
        int getno(){return sno;}
        string getname(){return name;}
};


template <class T> class Item{
    private:
        T* tp;
    public:
        Item(T* tp){
            this->tp=tp;
        }
        ~Item(){
            delete tp;
        }
        void getInformation(){
            if(typeid(T)==typeid(student)){
                cout<<"学号:"<<tp->getno()<<" ";
                cout<<"学生姓名:"<<tp->getname()<<endl;
            }else if(typeid(T)==typeid(teacher)){
                cout<<"工号:"<<tp->getno()<<" ";
                cout<<"教师姓名:"<<tp->getname()<<endl;
            }
        }

}; 
int main(){
    Item i(new student(2014114,"张璇"));
    i.getInformation();
    Item<teacher> i1(new teacher(2001401,"李朱强"));
    i1.getInformation();

}

类模板中用到的类T的不同情况要有相同的字段,因为模板的解释是发生在编译阶段的,如果用了不同的字段,则会因为类和字段不对应找不到成员,导致编译不通过。

如上的例子中,teacher和student有相同的成员函数getno()和getname(),所以在模板类中调用两个函数可以自动识别,如果两个函数定义成不同的,如:

class student:public people{
    protected:
        int sno;
    public:
        student(){sno=-1;}
        student(int no,string name):people(name){sno=no;}
        int getSno(){return sno;}
        string getSname(){return name;}
};
class teacher:public student{
    public:
        teacher(int no,string name):student(no,name){}
        int getTno(){return sno;}
        string getTname(){return name;}
};
template <class T> class Item{
    private:
        T* tp;
    public:
        Item(T* tp){
            this->tp=tp;
        }
        ~Item(){
            delete tp;
        }
        void getInformation(){
            if(typeid(T)==typeid(student)){
                cout<<"学号:"<<tp->getSno()<<" ";
                cout<<"学生姓名:"<<tp->getSname()<<endl;
            }else if(typeid(T)==typeid(teacher)){
                cout<<"工号:"<<tp->getTno()<<" ";
                cout<<"教师姓名:"<<tp->getTname()<<endl;
            }
        }

};

那么在模板中,确定模板类型后,假设为student,就会因为student没有getTno()和getTname()字段而无法通过编译,因为模板T识别为student是发生在编译阶段的,一旦确定为student,模板类中所有的T都会被替换成student,所以就出现"student类无getTno()和getTname()成员"的错误。

标签:return,name,C++,tp,student,温故,public,模板
From: https://www.cnblogs.com/Tenerome/p/cppreview13.html

相关文章

  • C++温故补缺(十二):动态内存
    C++动态内存同C,C++中也是有堆和栈的概念。栈是函数内部声明的所有变量都所占用空间,堆是程序中未使用的内存,在程序运行期间可用于动态分配。同样也有alloc()分配内存,新增......
  • C++温故补缺(十一):异常
    异常处理参考:cnblogs异常和错误(bug)异常:是程序开发过程中必须考虑的一些特殊情况,是程序运行时可以预料的执行分支。异常是不可以避免的,如0除问题,数组越界问题,文件不存在......
  • C++温故补缺(十):C++文件读写和流
    C++文件和流C++文件的读写流用的是fstream库,它定义了三个新的数据类型:数据类型描述ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。ifstr......
  • 15_SpringBoot_模板引擎总结_了解
    jsp优点:1、功能强大,可以写java代码2、支持jsp标签(jsptag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签库缺点:性能问题。不支持前后端分离freemarkerFreeMa......
  • 15_SpringBoot_模板引擎总结_了解
    jsp优点:1、功能强大,可以写java代码2、支持jsp标签(jsptag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签库缺点:性能问题。不支持前后端分离freemarkerFreeMa......
  • 数字化转型必备:营销模板与小程序容器技术助力企业数字化营销
    在数字化时代,营销活动的方式也随之改变。 营销模板和小程序容器是两种现代化的数字营销技术。营销模板是一种可以快速创建专业级营销材料的软件工具,而小程序容器技术......
  • 新功能!FinClip有营销模板啦!
    苦于寻找营销模板的小伙伴们快看过来!近日,FinClip新上线了多项开发者期待已久的功能,其中的「营销模板」能够帮助小程序与应用开发者快速在已有App中引入多个具备「营销......
  • 做营销,你用过小程序营销模板吗?
    在这个信息传播迅速的网络时代,商品营销尤为重要,而不是“千万富翁酒香不怕巷子深”的时代,现在有各种各样的产品让消费者眼花缭乱。而好的营销可以让你的商品更多消费者看到,......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很容......
  • C 栈模板及笔记
    文章目录​​Intro​​​​1.熟练掌握栈的定义、特性和栈的抽象数据类型,​​​​定义​​​​是限定仅在队尾进行插入或删除操作的先行比爱​​​​特性​​​​表尾端......