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

C++ 重载和模板

1.operator

operator关键字用于定义运算符重载(Operator Overloading)或类型转换运算符(Type Conversion Operator)。其核心作用是让自定义类型(如类、结构体)能够像内置类型一样使用运算符(如+, ==, <<)或进行类型转换。

1.运算符重载

1.语法与作用
operator关键字后接运算符符号(如+, -, []),用于定义自定义类型的运算符行为。

2.运算符重载的规则
1.可重载的运算符:如+, -, *, /, ==, [], (), <<, >>等。
2.不可重载的运算符:., ::, ?:, sizeof, typeid等。

3.成员函数 vs 非成员函数:
1.成员函数:左侧操作数是this对象,参数只需右侧操作数(如a + b中的b)。
2.非成员函数:需显式指定左右操作数。

2.类型转换运算符中的operator

1.语法与作用
operator关键字后接目标类型名,用于定义从当前类型到其他类型的转换规则。

2.避免隐式转换风险:过多隐式转换会导致代码行为不可预期。
1.方法:C++ Core Guidelines C.60:单参数构造函数和类型转换运算符应标记为explicit。

2.模板

模板(Templates) 是一种泛型编程机制,允许你编写与类型无关的代码,从而实现高度可复用的组件。

1.函数模板

1.语法
1.template:声明这是一个模板定义。
2.typename(或 class):指定 T 为一个类型参数。
3.T 是一个占位符,代表未来使用模板时指定的具体类型。

2.推荐使用 typename
1.语义更明确
typename 直观地表明 “这里需要一个任意类型”,而 class 可能误导读者认为 “只能接受类类型”。

2.消除嵌套依赖名称的歧义
在模板内部,当引用依赖于模板参数的嵌套类型时,必须使用 typename 标识这是一个类型(而非变量或函数)。

class仅适用于类类型,无法表示其他类型(如enum或typedef)。

2.类模板

函数模板会自动推导T的类型,类模板需要显式指定。

3.模板机制与编译过程

两阶段编译(Two-Phase Translation):
1.第一阶段:检查模板定义的语法正确性。
2.第二阶段:实例化模板,并检查模板代码的使用是否合法(如T是否支持operator>)。

模板实例化(Instantiation):
1.隐式实例化:编译器根据调用自动生成代码。
2.显式实例化:手动指定需要生成的实例(减少编译时间)。
template class Vector; // 显式实例Vector

分离编译问题:模板定义通常需放在头文件中(因编译时实例化需完整定义)。

4.模板特化

模板特化允许你为模板的特定类型参数提供定制实现。这使你能够在保持模板通用性的同时,针对某些特殊类型优化或改变行为。

模板特化分为全特化和偏特化

1.全特化

为特定类型提供完全定制的实现。

1.语法
template <>  // 空模板参数列表
返回类型 模板名<特化类型>(参数列表) { /* 实现 */ }

2.偏特化

为一组类型(如指针、引用或满足特定条件的类型)提供定制实现(仅适用于类模板)

1.语法
template <模板参数列表>
class 模板名<特化参数列表> { /* 实现 */ }
2. 注意项

1.函数模板只能全特化,不能偏特化。若需类似偏特化效果,可使用函数重载:
2.特化需与通用模板声明在同一命名空间。
3.特化的声明和定义需保持一致

5.模板元编程

C++ 中一种独特的编程技术,它利用模板在编译时执行计算,将传统运行时的任务提前到编译阶段完成。这种技术可以优化性能、生成更高效的代码,并实现编译时类型检查。

1. 可变参数模板(Variadic Templates)

是 C++11 引入的强大特性,允许模板接受任意数量、任意类型的参数。这为泛型编程提供了极大的灵活性,是标准库中std::tuple、std::make_shared等组件的基础。
1.基本语法
1.参数包(Parameter Pack)
1.模板参数包:template <typename… Args>
表示任意数量的类型参数。
2.函数参数包:Args… args
表示任意数量的函数参数。

http://www.xdnf.cn/news/894979.html

相关文章:

  • 离散数学_数理逻辑(三):一阶逻辑概念及一阶逻辑命题符号化
  • 蒙特卡罗模拟: 高级应用的思路和实例
  • minimatch 详解:功能、语法与应用场景
  • ResolverActivity 优先级
  • 竞品分析六大步骤
  • 如何防止看板任务长期停滞不前
  • 【xshell】已经安装对应版本xftp,xshell中点击xftp快捷按钮,提示“使用此功能需要Xftp。单击下载按钮,转到Xftp下载页”
  • 如何在运动中保护好半月板?
  • 插入排序,二分查找,字符数组 day8
  • linux C语言中的动态库 静态库说明
  • 智慧停车设备选型指南:何时应优先考虑免布线视频桩方案?
  • QT中使用libcurl库实现到ftp服务器的上传和下载
  • Debugger encountered an exception:Exception at 0x7ff809232bdc
  • 【6.2-6.9学习周报】
  • [免费]SpringBoot+Vue鲜花销售商城系统【论文+源码+SQL脚本】
  • Spring Boot统一功能处理深度解析
  • 如何设置合适的缓存过期时间(TTL)?是否有必要实现缓存预热?
  • 【PmHub面试篇】PmHub集成Redission分布式锁保障流程状态更新面试专题解析
  • 【inode使用 100%,导致项目异常】
  • 【学习分享】shell基础-参数传递
  • 使用反射对任意对象进行二进制序列化的程序
  • 行内样式:深入解析与应用指南
  • Vue.js应用结合Redis数据库:实践与优化
  • 更改安卓虚拟机屏幕大小
  • ICLR文章如何寻找页码
  • 【高频面试题】快慢指针及相关应用
  • 客户体验数据使用的三种视角——场景视角
  • 等比数列的概念及性质02
  • 沉金电路板工艺解析:从原理到应用的全面指南
  • 2025年06月05日Github流行趋势