c++模版

简介: c++模版

1.什么是模版?

生活中比如常用的ppt模版,年终报告模版等,共有的特性通用性、不能直接使用、不是万能的

2.c++中的模版

c++处理面向对象编程思想还有面向泛型编程,面向泛型编程主要用的技术就是模版,模版有函数模版和类模版

3.函数模版

建立一个通用的函数,返回值类型和形参类型不具体指定,是通用类型,使用的时候才确定。

比如交换两个整型数字函数

此时可以定义一个用于交换两个数的函数模版,但是具体数的类型不知道

#include <iostream>
using namespace std;
 
template<typename T>//告诉编译器紧跟着的是一个函数模版 T是通用的数据类型
void myswap(T &a,T &b) {
  T temp= a;
  a = b;
  b = temp;
}
 
int main() {
  int a = 10;
  int b = 20;
  //调用模版函数第一种方式
  myswap(a, b);
  //调用模版函数第二种方式,支出T具体类型
  myswap<int>(a, b);
  cout << "a="<<a<<"b="<< b;
}

注意:

1.上面的typename可以替换成关键字class

2.调用的时候T必需明确什么数据类型

3.函数模版也可重载,这点就可以为特定类型提供具体化的模版

class person {
public:
  int age;
  string name;
};
 
template<typename T>
int compare(T& a, T& b) {
  if (a == b) {
    return 1;
  }
  else {
    return -1;
  }
};
//具体化模版规则,指出数据类型
template<> int compare(person &a, person &b) {
  if (a.age== b.age) {
    return 1;
  }
  else {
    return -1;
  }
}
 
 
int main() {
  person p;
  p.age = 10;
  person p1;
  p1.age = 20;
  //优先调用具体化模版
  compare(p, p1);
}

4.学习模版主要是为了使用stl中的模版,而不是自己写模版

4.类模版

一个通用的类,成员变量的数据类型不确定

template<class ageType,class nameType>//ageType和nameType是通用类型
class person {
public:
  person(ageType age, nameType name) {
    this->age = age;
    this->name = name;
  }
public:
  ageType age;
  nameType name;
  void say() {
    cout << "年龄:"<<age << "姓名:" << name;
  }
};
 
 
int main() {
  person<int, string> p(10, "lisi");
  p.say();
}

类模版在模版的参数列表中可以有默认的参数类型,如下

template<class ageType,class nameType=string>

注意:

1.普通函数中的成员函数一开始就创建,但是类模版只有调用才创建

2.类模版对象作为函数参数传递方式有以下三种

#include <iostream>
#include <string>
using namespace std;
 
template<class ageType,class nameType=string>
class person {
public:
  person(ageType age, nameType name) {
    this->age = age;
    this->name = name;
  }
public:
  ageType age;
  nameType name;
  void say() {
    cout << "年龄:"<<age << "姓名:" << name;
  }
};
//1.第一种
void test1(person<int, string>& p) {
  p.say();
}
//2.第二种参数模板化 但是调用的时候给出
template<class T1 ,class T2>
void test2(person<T1, T2>& p) {
  p.say();
}
//3.第三种整个类模板化 但是调用的时候给出
template<class T>
void test3(T& p) {
  p.say();
}
 
int main() {
  person<int, string> p(10, "lisi");
  test1(p);
  test2(p);
  test3(p);
}

3.类模版与继承

template<class ageType,class nameType=string>
class person {
 
};
//子类
class man :public person<int, string> {
 
};

4.类模版中的函数在类外实现

#include <iostream>
#include <string>
using namespace std;
 
template<class ageType,class nameType=string>
class person {
public:
  person(ageType age, nameType name);//类内声明
public:
  ageType age;
  nameType name;
  void say();
};
//类外实现
template<class T1,class T2>
person<T1,T2>::person(T1 age, T2 name) {
  this->age = age;
  this->name = name;
}
int main() {
  person<int, string> p(10, "lisi");
  
}

5.类模版中成员函数分文件编写问题以及解决


相关文章
|
6月前
|
存储 算法 编译器
【C++入门到精通】C++入门 —— 模版(template)
模板是C++中的一种编程工具,它允许使用通用代码来定义函数和类,以适应多种类型或值的需求,从而实现代码的复用和泛化。模板实质上是一种参数化的类型或值的规范。
84 0
|
6月前
|
算法 安全 编译器
【C++】从零开始认识泛型编程 — 模版
泛型编程是C++中十分关键的一环,泛型编程是C++编程中的一项强大功能,它通过模板提供了类型无关的代码,使得C++程序可以更加灵活和高效,极大的简便了我们编写代码的工作量。
74 3
|
28天前
|
Unix 编译器 Linux
C++之模版进阶篇(下)
C++之模版进阶篇(下)
42 0
|
28天前
|
编译器 C++
C++之模版进阶篇(上)
C++之模版进阶篇(上)
13 0
|
28天前
|
编译器 C语言 C++
C++之模版初阶
C++之模版初阶
12 0
|
1月前
|
存储 编译器 C++
【C++模版初阶】——我与C++的不解之缘(七)
【C++模版初阶】——我与C++的不解之缘(七)
|
5月前
|
C++
C++中函数模版与类模版
C++中函数模版与类模版
51 4
|
6月前
|
算法 安全 编译器
C++:模版初阶 | STL简介
C++:模版初阶 | STL简介
|
6月前
|
算法 安全 编译器
C++:模版进阶 | Priority_queue的模拟实现
C++:模版进阶 | Priority_queue的模拟实现
|
6月前
|
机器学习/深度学习 存储 算法
C++ 模版函数介绍:介绍模版函数的基本概念、用法和作用
C++ 模版函数介绍:介绍模版函数的基本概念、用法和作用
65 1