C++笔记(7):泛型编程和模板(函数模板和类模板)

                    泛型编程和模板

0.泛型编程

1.函数模板

2.类模板

-----------------------------------------------------------------------------------------------------------

0.泛型编程

  所谓泛型就是以独立于任何特定类型的方式编写代码。前面介绍的标准库的容器、迭代器和算法都是泛型编程的具体应用。
  模板是泛型编程的基础。使用模板的时候不需要知道模板是如何定义的,但今天我们来介绍如何定义自己的模板类和模板函数。

-----------------------------------------------------------------------------------------------------------

1.模板基础

函数模板
如下面的比较函数:
  template <typename T>          //template 和typename 都是关键字,保持不变,变的只有类型T
  int cmp(T v1, T v2)
  {
      if(v1 > v2)
         return 1
       else if(v1 < v2)
         return -1;
   return 0;
  }
 
cmp(10, 20);
cmp(str1, str2);

编译器将实例化cmp的两个不同的版本,使用int和string代替T来生成上述两种类型的函数。
int cmp(int v1, int  v2)
{
  if(v1 > v2)
     return 1
  else if(v1 < v2)
     return -1;
  return 0;
}

int cmp(string v1, string v2)
{
  if(v1 > v2)
     return 1
  else if(v1 < v2)
     return -1;
  return 0;
}
 
可以将模板函数声明为inline函数。

template<typename T>
inline int cmp(T v1, T v2);
 
注意inline的放置位置。

-----------------------------------------------------------------------------------------------------------

2.类模板
类模板也是模板的一种,需要以关键字template开头后接模板形参表。
类模板的定义跟一般的类定义类似,可以有自己的数据成员和方法以及类型成员。还可以定义构造函数和析构函数。
只是在定义类和类的成员函数的时候,使用模板形参作为占位符,与内置类型或类类型使用方式完全一样。
template<typename T>
class myclass
{
 public:
    class_name();
    ~class_name();
    T func(T& t);
 private:
    T m_t;
};
 
 
类模板成员函数
模板成员函数的定义需要以关键字template关键字开始,后接模板形参表
template<typename T>
T class_name<T>::func(T& t)
{
 //.....
}
 
实例化
模板是一个蓝图,编译器使用模板产生指定的类或函数的特定类型的版本。这个过程被称为实例化。
函数模板在调用的时候就行实例化。类模板则在使用实际模板类型时进行实例化。

myclass<int> obj;
编译器在编译的时候,将int类型替换myclass模板类中的形参T。
 
泛型编程与类模板属于高级主题,这里我们不详细介绍关于它的一些零零碎碎的知识点,介绍过多会让大家有云里雾里的感觉。
当大家对C++理解到一定程序之后再来学习类模板会有更大的收货。
下面我们来介绍一个实例。实现自己的vector类。

时间: 2024-12-28 07:07:13

C++笔记(7):泛型编程和模板(函数模板和类模板)的相关文章

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }

C++ 模板的编译 以及 类模板内部的实例化

在C++中,编译器在看到模板的定义的时候,并不立即产生代码,只有在看到用到模板时,比如调用了模板函数 或者 定义了类模板的 对象的时候,编译器才产生特定类型的代码. 一般而言,在调用函数的时候,只需要知道函数的声明即可: 在定义类的对象时,只需要知道类的定义,不需要成员函数的定义. 但是,这对于模板编译是不奏效的,模板要进行实例化,则必须能够访问定义模板的源代码,当调用函数模板以及类模板的成员函数 的时候,需要知道函数的定义. 标准C++对于模板的编译提供了两种策略: 相同之处:"将类定义以及函

C++—模板(2)类模板与其特化

我们以顺序表为例来说明,普通顺序表的定义如下: 1 typedef int DataType; 2 //typedef char DataType; 3 class SeqList 4 { 5 private : 6 DataType* _data ; 7 int _size ; 8 int _capacity ; 9 } ; 模板类也是模板, 必须以 关键字templ ate开头, 后接模板形参表. 模板类一般格式如下:template<class 形参名 1, class 形参名 2, .

C++学习笔记47:链表的概念与结点类模板

学堂在线学习笔记 链表的概念与结点类模板 顺序访问的线性群体--链表类 链表是一种动态数据结构,可以用来表示顺序访问的线性群体: 链表是由系列结点组成,结点可以在运行时动态生成: 每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址).如链表中每个结点中只有一个指向后继结点的指针,则该链表称为单链表: 单链表的结点类模板 template <class T> void Node<T>::insertAfter(Node<T> *p) { //p结点指针域

C++学习之模板 (二) -----类模板

由于将函数和类模板放在一块篇幅较大,我们今天将其拆分为两篇博文. 上篇博文我们讨论了函数模板的简单应用,本篇我们继续讨论模板的另一板块--类模板. 1).作用:类模板类似于代码产生器,根据用户输入的类型不同,产生不同的class: 2).编译: a):检查模板class 的自身语法: b):根据用户指定的类型 如 vector<string>,去实例化一个模板类. 注意: 不是实例化所以的代码,而仅仅实例化用户调用的部分: 类模板:简单实现如下; 1 #include <iostream

第2章 类模板:2.1 类模板Stack的实现

Chapter 2: Class Templates 第2章 类模板 Similar to functions, classes can also be parameterized with one or more types. Container classes, which are used to manage elements of a certain type, are a typical example of this feature. By using class templates

类模板的友元

详见http://www.cnblogs.com/assemble8086/archive/2011/10/02/2198308.html 类模板的友元有三种声明: 1)非模板类的友元类或友元函数 1 template <typename T> 2 class Rect{ 3 public: 4 friend void create(); 5 }; create函数成为所有Rect类实例化的友元,它可以访问全局对象;可以使用全局指针访问非全局对象;可以创建自己的对象;可以访问独立对象的模板类的

C++ Primer 学习笔记_82_模板与泛型编程 --类模板成员[续2]

模板与泛型编程 --类模板成员[续2] 六.完整的Queue类 Queue的完整定义: template <typename Type> class Queue; template <typename Type> ostream &operator<<(ostream &,const Queue<Type> &); template <typename Type> class QueueItem { friend clas

C++ Primer 学习笔记_80_模板与泛型编程 --类模板成员

模板与泛型编程 --类模板成员 引言: 这一节我们介绍怎样实现前面提到的Queue模板类. 标准库将queue实现为其他容器之上的适配器.为了强调在使用低级数据结构中设计的编程要点,我们将Queue实现为链表.实际上,在我们的实现中使用标准库可能是个更好的决定!!-_-. 1.Queue的实现策略 如图所示,我们实现两个类: 1)QueueItem类表示Queue的链表中的节点,该类有两个数据成员item和next: a. item保存Queue中元素的值,它的类型随Queue的每个实例而变化: