当前位置: 首页 > news >正文

C++ | 高级教程 | 泛型模板

👻 概念

  • 泛型编程 —— 以一种独立于任何特定类型的方式编写代码,如向量有 vector <int>vector <string>
  • 模板 —— 泛型编程的基础,是创建泛型类或函数的蓝图或公式

👻 函数模板

👾语法格式

使用 关键字 template 声明模板

template <typename T> return_type function_name(parameter list) {
	// 函数主体
}
  • template <typename T> —— 声明模板参数
  • return_type —— 返回类型
  • function_name —— 名称
  • parameter list —— 函数参数列表

👾示例代码

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

...

int i = 5, j = 1;
cout << "Max(i, j) = " << Max(i, j) << endl;			// Max(i, j) = 5

double f1 = 5.5, f2 = 1.5;
cout << "Max(f1, f2) = " << Max(f1, f2) << endl;		// Max(f1, f2) = 5.5

string s1 = "Hello", s2 = "World";
cout << "Max(s1, s2) = " << Max(s1, s2) << endl;		// Max(s1, s2) = World
template <typename T> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; }
  • inline —— 建议编译器函数内联展开,减少调用开销(函数主体很短)
  • & —— 使用引用避免复制对象,提高效率
  • const —— 保证参数不会被修改

👻 类模板

👾语法格式

template <class T> class class_name {
	// 类主体
}
template <class T> return_type class_name<T>::function_name(parameter list) {
	// 类成员函数主体
}
  • template <class T> —— 声明模板参数
  • class_name —— 类名

👾示例代码

template<class T> class Stack {
	private:
		vector<T> elems;
	public:
		bool empty() const;
		void push(T const&);
		void pop();
		T top() const;
};

/* 为空返回真 */
template<class T> bool Stack<T>::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(); // 返回最后一个元素的副本
}

...

try {
	Stack<int> intStack; 
	intStack.push(1);
	cout << intStack.top() <<endl;	// 输出 1
	intStack.pop();
	intStack.pop();
} catch (exception const& ex) {
	cerr << "Exception: " << ex.what() << endl;	// 输出 Exception: Stack<>::pop(): empty stack
	return -1;
}

在类成员函数内部声明时,通常不需要指定参数名 elem,即直接使用 push(T const&)

void push(T const&);

在类成员函数外部定义时,需要指定参数名,因为是函数的具体实现部分,即 push(T const& elem)

template <class T> void Stack<T>::push(T const& elem) { ... }

在声明中省略参数名,优点:

  • 简洁性:声明的目的是告诉编译器函数的签名,而不是具体的实现细节。省略可以使声明更加简洁
  • 一致性:参数名在声明中可能没有实际意义,不会被编译器使用。省略可以避免不必要的冗余

在定义模板类的成员函数时,必须指定模板参数 Stack<T>,确保编译器能够正确地实例化模板类,即:

template <class T> void Stack<T>::pop() { ... }  	// 正确的,Stack<T>::pop
template <class T> void Stack::pop() { ... }  	// 错误的,Stack::pop

关键字 const 在函数声明和定义中可以用于修饰成员函数,表示该成员函数不会修改对象的任何成员变量。这种函数称为 常量成员函数const 成员函数

template <class T> T Stack<T>::top() const { ... }
  • const 成员函数

    • 不修改对象的任何成员变量,使得其可以在 const 对象上调用,而不违反 const 的语义
    const Stack<int> intStack;
    intStack.push(4);			 // 编译错误,无法调用 
    int top = intStack.top();	 // 编译正确,只有 const 成员函数可以调用
    
    • 不能调用非 const 成员函数,只能调用其他 const 成员函数
  • const 对象:

    • 只能调用对象的 const 成员函数。

相关文章:

  • 数据结构秘籍(一)线性数据结构
  • 注意力机制有哪些,原理是什么
  • 细说STM32F407单片机RS485收发通信实例及调试方法
  • wordpress使用CorePress主题设置项总结
  • Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入
  • Python Pandas带多组参数和标签的Oracle数据库批量数据导出程序
  • MySQL-MATCH ... AGAINST工具
  • linux--多进程开发(5)--进程间通信(IPC)、linux间通信的方式、管道
  • 全价值链数字化转型:以美的集团为例,探索开源AI大模型与S2B2C商城小程序源码的融合应用
  • MySQL之Redo Log:确保数据持久性和崩溃恢复
  • MySql 获取表结构的4中方法
  • 【如何优化 Vue.js 项目的性能?】
  • mfy学习笔记
  • C# 数据类型
  • C#异步编程之async与await
  • sklearn机器学习 Python代码通用模板
  • 【vue3+highCharts】图表及字体大小自适应
  • 道路三维数字化技术产品方案介绍(软硬件一体,适用于各等级公路)
  • Linux文本编译器
  • 供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)
  • 安徽建设网官方网站/2024年新闻摘抄十条
  • 银川网站建设多少钱/嘉兴seo报价
  • 一个小程序开发费用/seo搜索引擎优化实战
  • 恋爱ppt模板免费下载网站/营销型企业网站建设步骤
  • 某互联网公司开发官网的首页/宁波seo推广服务
  • 深圳网站建设公司哪家好/怎样做seo搜索引擎优化