主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 模板


上一章 下一章

模板是泛型编程的基础,涉及编写独立于任何特定类型的代码。

模板是一种创建通用类或函数的蓝图或公式。像迭代器和算法这样的库容器就是泛型编程的例子,并且是使用模板概念开发的。

每个容器如向量都只有一个定义,但是我们可以定义多种不同类型的向量,例如 vector<int> 或者 vector<string>。

你可以使用模板来定义函数以及类,让我们看看它们是如何工作的:

函数模板

函数模板定义的一般形式如下:

template <class Type> 返回类型 函数名(参数列表) {
   // 函数体
}

这里,Type 是函数中使用的数据类型的占位名称。这个名称可以在函数定义中使用。

以下是一个函数模板的示例,它返回两个值中的最大值:

#include <iostream>
#include <string>

using namespace std;

template <typename T>
inline T const& Max (T const& a, T const& b) { 
   return a < b ? b:a; 
}

int main () {
   int i = 39;
   int j = 20;
   cout << "Max(i, j): " << Max(i, j) << endl; 

   double f1 = 13.5; 
   double f2 = 20.7; 
   cout << "Max(f1, f2): " << Max(f1, f2) << endl; 

   string s1 = "Hello"; 
   string s2 = "World"; 
   cout << "Max(s1, s2): " << Max(s1, s2) << endl; 

   return 0;
}

如果我们编译并运行上述代码,这将产生以下结果:

Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World

类模板

正如我们可以定义函数模板一样,我们也可以定义类模板。通用类声明的一般形式如下:

template <class Type> class 类名 {
   .
   .
   .
}

这里,Type 是占位类型名称,在类实例化时将被指定。你可以通过使用逗号分隔的列表定义多个泛型数据类型。

以下是一个定义类 Stack<> 并实现通用方法来从栈中压入和弹出元素的示例:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>

using namespace std;

template <class T>
class Stack {
 
   private: 
      vector<T> elems;    // 元素 

   public: 
      void push(T const&);  // 压入元素 
      void pop();               // 弹出元素 
      T top() const;            // 返回顶部元素 
      
      bool empty() const {      // 如果为空则返回真。
         return elems.empty(); 
      } 
}; 

template <class T>
void Stack<T>:
:push (T const& elem) { 
   // 添加传递元素的副本 
   elems.push_back(elem);    
} 

template <class T>
void Stack<T>:
:pop () { 
   if (elems.empty()) { 
      throw out_of_range("Stack<>::pop(): empty stack"); 
   }
   
   // 移除最后一个元素 
   elems.pop_back();         
} 

template <class T>
T Stack<T>:
:top () const { 
   if (elems.empty()) { 
      throw out_of_range("Stack<>::top(): empty stack"); 
   }
   
   // 返回最后一个元素的副本 
   return elems.back();      
} 

int main() { 
   try {
      Stack<int>         intStack;  // 整数栈 
      Stack<string> stringStack;    // 字符串栈 

      // 操作整数栈 
      intStack.push(7); 
      cout << intStack.top() <<endl; 

      // 操作字符串栈 
      stringStack.push("hello"); 
      cout << stringStack.top() << std::endl; 
      stringStack.pop(); 
      stringStack.pop(); 
   } catch (exception const& ex) { 
      cerr << "Exception: " << ex.what() <<endl; 
      return -1;
   } 
} 

如果我们编译并运行上述代码,这将产生以下结果:

7
hello
Exception: Stack<>::pop(): empty stack
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图