C++与Typescript的区别

目录

一、C++类模板和函数模板

1.类模板

2.函数模板

二,Typescript 的泛型声明

1.泛型函数

2.泛型类

为什么C++和Typescript语言中主张模板和泛型


一、C++类模板和函数模板

在C++中,类模板和函数模板允许你为多种数据类型编写通用的代码。这就像每个人都有鼻子,耳朵,眼镜。但是有些人整合在一起就是帅哥美女,有的就长成。。。

C++主要分为两个模板-------类模板和函数模板。

1.类模板

template<class T1, class T2, class Tn>
class 类模板名
{// 类内成员定义
};

通常类模板是这样的格式。(typename是用来定义模板参数关键字也可以使用class。切记:不能使用struct代替class)

template <typename T>  
class AnimalHouse {  
private:  T size; // 房间的大小  
public:  AnimalHouse(T size) : size(size) {} // 构造函数,用来设置房间的大小  void displaySize() {  std::cout << "房间的大小是:" << size << std::endl;  }  
};
//这样使用
int main
{
AnimalHouse<int> elephantHouse(100); // 创建一个大房间给大象住,大小为100  
elephantHouse.displaySize(); // 显示这个大房间的大小  AnimalHouse<int> rabbitHouse(50); // 创建一个小房间给兔子住,大小为50  
rabbitHouse.displaySize(); // 显示这个兔子的小房间的大小
}

 在这个例子中,AnimalHouse 是一个类模板,它接受一个类型参数 T。这个T可以是任何数据类型,比如int、float或者自定义的数据类型。通过使用类型参数 T,你可以创建不同大小的房间。

2.函数模板

template<typename T1, typename T2,......,typename Tn>
返回值 函数名(参数列表)
{}

typename是用来定义模板参数关键字也可以使用class。切记:不能使用struct代替class。

template <typename T>  
T magicBox(T a, T b, bool operation){  if (operation) {  return a + b; // 如果选择加法,就返回两个数的和  }else{  return a - b; // 如果选择减法,就返回第一个数减去第二个数的结果  }  
}int main()
{
int a=5;
int b=3;
std::cout<<magicBox<int>(a,b,true)<<std::endl; // 计算5 + 3 = 8并输出结果
std::cout<<magicBox<int>(a,b,false)<<std::endl;// 计算5 - 3 = 2并输出结果
}

 在这个例子中,magicBox 是一个函数模板,它接受两个类型参数 T 和一个布尔值 operation。类型参数 T 可以是任何数据类型,比如int、float或者自定义的数据类型。布尔值 operation 用来决定是做加法还是减法。

类模板函数模板
定义方式使用template关键字后跟类型参数与类模板相同
适用场景适用于需要创建不同数据类型的对象,并使用相同逻辑处理的场景适用于需要编写处理不同数据类型的通用函数的场景
代码复用通过创建模板类的实例来复用代码通过函数模板来复用代码
实例化次数类模板的实例化次数与其对象实例的创建次数一致函数模板的实例化次数与其函数的调用次数一致
类型参数的使用范围类型参数用于类声明和类实现中的成员函数和成员变量类型参数用于函数声明和函数定义中,也可以用于返回值和参数类型
自动数据类型推导不可以不可以

二,Typescript 的泛型声明

TypeScript 是 JavaScript 的一个超集(父集),增加了类型检查和其他的特性。在 TypeScript 中,你可以使用泛型来编写可重用的组件或函数,这些组件或函数可以处理多种数据类型。它的泛型有两种分别是泛型函数和泛型类

1.泛型函数

function identity<T>(arg: T): T {  return arg;  
}  let output = identity(10);  

在上面的例子中,identity 函数是泛型函数。它使用 <T> 来定义一个类型参数,并在函数的参数和返回类型中使用这个类型参数。

2.泛型类

class GenericNumber<T> {  zeroValue: T;  add: (x: T, y: T) => T;  
}  let myGenericNumber = new GenericNumber<number>();  
myGenericNumber.zeroValue = 0;  
myGenericNumber.add = (x, y) => x + y;

在这个例子中,我们创建了一个名为 GenericNumber 的泛型类,它有一个类型参数 T。然后我们创建了 GenericNumber 的一个实例 myGenericNumber,并指定 T 为 number 类型。这样,我们就可以在 myGenericNumber 对象上使用数字操作了。

<T>表示定义模板类型,(value: T): T 表示参数和返回值类型都是同一个类型,具体T是什么类型就实参决定。

C++模板TypeScript泛型
定义方式使用关键字 "template" 来定义函数或类模板使用泛型符号 "<>" 在函数或类声明中定义泛型
类型参数template<typename T1, typename T2>;
(注意这里typename要大写)
<T1, T2>
(C++和TypeScript都可以使用多个类型)
类型检查编译时进行类型检查,可以优化代码运行时进行类型检查,可能影响性能
函数模板/泛型函数

template<typename T> T add(T a, T b)

{
return a + b;
}

function add<T>(a: T, b: T): T

{
return a + b;
}

类模板/泛型类template<typename T> class Box { public: T content; Box(T value); };

class Box<T> 

{
public: T content; Box(T value);
};

为什么C++和Typescript语言中主张模板和泛型

  • 提高代码复用性:通过模板和泛型,程序员可以编写更加通用的代码,这些代码可以在多种数据类型上运行,而不需要为每一种数据类型单独编写代码。这大大减少了重复的代码,并提高了开发效率。
  • 提高代码可维护性:模板和泛型允许程序员将算法和数据结构与具体的类型分离,使得代码更加模块化。这使得代码更容易理解和维护,因为主要的逻辑被封装在独立的、可重用的组件中,而不是分散在大量的特定类型代码中。
  • 提供更好的类型安全:模板和泛型在编译时进行类型检查,这有助于在早期阶段发现并修复错误,而不是等到运行时才发现。这大大提高了代码的可靠性。
  • 提高性能:虽然泛型在运行时可能会引入一些性能开销,但通过使用泛型,程序员可以编写出更加通用的算法和数据结构,这些算法和数据结构可以在编译时进行优化,从而在某些情况下提供更好的性能。
  • 支持多范式编程:模板和泛型允许程序员使用多种编程范式,例如面向对象编程、函数式编程等。这使得语言更加灵活,能够更好地满足各种不同的编程需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山西电力市场日前价格预测【2024-01-14】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-14&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为851.84元/MWh&#xff0c;预计出现在18:15。最低日前电价为198.87元/MWh&#xff0c;预计…

使用 C++/WinRT 创作 API

如果 API 位于 Windows 命名空间中 这是你使用 Windows 运行时 API 最常见的情况。 对于元数据中定义的 Windows 命名空间中的每个类型&#xff0c;C/WinRT 都定义了 C 友好等效项&#xff08;称为投影类型 &#xff09;。 投影类型具有与 Windows 类型相同的完全限定名称&…

【LabVIEW FPGA入门】使用CompactRIO进行SPI和I2C通信

NI提供了 SPI and I2C Driver API&#xff1a;下载SPI and I2C Driver API - NI 该API使用FPGA数字I / O线与SPI或I2C设备进行通信。 选择数字硬件时&#xff0c;要考虑三个选项&#xff1a; NI Single-Board RIO硬件可同时使用SPI和I2C驱动程序。NI 9401 C系列模块与SPI驱动程…

大型语言模型,用最少的数学和行话进行解释

本文来自于《Large language models, explained with a minimum of math and jargon》&#xff0c;不嵌入任何笔者的个人理解&#xff0c;只是对原文的总结与记录。 文章作者是Tim Lee和Sean Trott&#xff0c;Tim Lee是一位拥有计算机科学硕士学位的记者&#xff0c;Sean Trot…

【二十】【动态规划】879. 盈利计划、377. 组合总和 Ⅳ、96. 不同的二叉搜索树 ,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

关于jupyter突然打不开的问题

好久没有用python了&#xff0c;我的电脑环境是安装过anaconda和pycharm&#xff0c;但是有些简单的东西就希望在jupyter中测试一下&#xff0c;但是最近发现jupyter打不开了。 具体是&#xff1a; 在这里打开jupyter是可以的&#xff0c;但是在命令行就不行&#xff0c;表现为…

计算机毕业设计 | SpringBoot+vue的家庭理财 财务管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 网络的发展已经过去了七十多年&#xff0c;网络技术的发展&#xff0c;将会影响到人类的方方面面&#xff0c;网络的出现让各行各业都得到了极大的发展&#xff0c;为整个社会带来了巨大的生机。 现在许多的产业都与因特网息息相关&#xff…

Python实现华容道问题详解

概要 华容道是一种古老的中国益智游戏&#xff0c;最早出现在中国的《千古文馆》中。这个游戏的目标是将一块特殊的方块从一个方形的棋盘中移出&#xff0c;通过滑动其他的方块来达到这个目标。本文将介绍如何使用Python来实现华容道问题&#xff0c;并提供详细的代码示例。 游…

飞鱼CRM接入第三方系统 飞鱼API对接详细教程

场景描述 在白码低代码开发平台中&#xff0c;是支持外部crm系统的线索通过接口流入到白码系统里面&#xff0c;换而言之&#xff0c;只要外部的系统有线索api接口&#xff0c;白码系统可以接收线索并在白码系统上进行后续操作。本文以飞鱼crm系统为例&#xff0c;讲解如何接收…

学习就要从简单的开始嘛,开始学一个个人博客吧

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

Linux/Haystack

Enumeration nmap 还是先看看端口对外开放情况&#xff0c;对外开放了22,80,9200 22应该是ssh&#xff0c;80是web&#xff0c;9200不知道是什么 TCP/80 访问web&#xff0c;没有什么链接&#xff0c;只有一张图片 有可能图片中有些东西&#xff0c;但还是尝试扫描一下网站…

ptaR7-6/zzuli2106 有去有回

题目 输入n个整数&#xff0c;第一趟按从左到右间隔k个数取数据&#xff0c;然后第二趟再从右到左间隔k-1个数取余下的数&#xff0c;如果数据没有取完&#xff0c;下一趟再间隔k-2个从左到右取数据&#xff0c;如此反复&#xff0c;直到所有的数据取完为止。注意&#xff1a;…

《SRE Google 运维解密》笔记

指导思想 介绍 Google 生产环境介绍 borg 是 k8s 的前身。 拥抱风险 服务质量 现在的 SLO 没有更细粒度的划分到季度 如果划分到季度&#xff0c;需要用这个数据来限制什么或者进行什么活动&#xff1f; L1S 链路的 SLA 的签署工作已经做了很多 对于 SLA 的达成情况数据没有…

Iceberg从入门到精通系列之十九:分区

Iceberg从入门到精通系列之十九&#xff1a;分区 一、认识分区二、Iceberg的分区三、Hive 中的分区四、Hive 分区问题五、Iceberg的隐藏分区六、分区变换七、分区变换 一、认识分区 分区是一种通过在写入时将相似的行分组在一起来加快查询速度的方法。 例如&#xff0c;从日志…

基于springboot生鲜交易系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

IPv6路由协议---IPv6动态路由(OSPFv3-3)

OSPFv3使用Link-local地址 OSPFv3是运行在IPv6上的路由协议,同样使用链路本地地址来维持邻居,同步LSA数据库。除Vlink外的所有OSPFv3接口都使用链路本地地址作为源地址及下一跳来发送OSPFv3报文,带来的好处: 不需要配置IPv6全局地址,就可以得到OSPFv3拓扑,实现拓扑与地址…

【职工管理系统(C++版)】

一、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息。 本次主要利用C来实现一个基于多态的职工管理系统。 公司中职工分为三类:普通员工、经理、老板&#xff0c;显示信息时&#xff0c;需要显示职工编号、职工姓名、职工岗位、以及职责。 普通员工职责:完成经…

Nacos和Eureka比较、统一配置管理、Nacos热更新、多环境配置共享、Nacos集群搭建步骤

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Nacos和eureka的对比二、统一配置管理二、Nacos热更新方式一方式二 三、多环境配置共享四、Nacos集群搭建步骤&#xff08;黑马springCloud的p29&#xff0…

springboot邮件发送

一、讲一下thymeleaf的简单使用 1.在根路径下写一个 resources/templates/good.html 文件 2. 在代码实现 记得 不要加 RequestBody这个注解&#xff0c;因为它会把string当作普通 的字符串&#xff0c;而不是去渲染对应的good.html视图 3.看效果 关于图片的显示&#xff0…

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…