当前位置: 首页 > 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.lqws.cn/news/155269.html

相关文章:

  • 美化显示LLDB调试的数据结构
  • 数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
  • 【达梦数据库】OOM问题排查思路
  • 03 Deep learning神经网络的编程基础 代价函数(Cost function)--吴恩达
  • 机器学习——什么时候使用决策树
  • Django之表格上传
  • JUnit
  • 实现单例模式的常见方式
  • 基于Java(SpringBoot、Mybatis、SpringMvc)+MySQL实现(Web)小二结账系统
  • 一、ES6-let声明变量【解刨分析最详细】
  • 华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
  • 快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令
  • 机器学习实验八--基于pca的人脸识别
  • 游戏开发中的CI/CD优化案例:知名游戏公司Gearbox使用TeamCity简化CI/CD流程
  • 深入解析CI/CD开发流程
  • Bug问题
  • Java 高频面试题场景(四):社区老年大学在线学习平台系统
  • 如何处理React中表单的双向数据绑定?
  • pg数据库表里面id值,使用sql语句赋值,唯一性
  • 数学运算在 OpenCV 中的核心作用与视觉效果演示
  • chrome使用手机调试触屏web
  • latex画表格
  • NoSQl之Redis部署
  • Android15 launcher3
  • SQL进阶之旅 Day 16:特定数据库引擎高级特性
  • PostgreSQL 入门教程
  • AI应用工程师面试
  • OpenCV 图像像素的逻辑操作
  • 【CPU】英特尔酷睿Ultra 5 225H与Ultra7 258V(Lunar Lake架构)PK
  • Sublime Text4 4192 安装