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.hqwc.cn/news/337233.html

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

相关文章

numpy100练习题,包含相应使用函数解释

取自github开源项目&#xff1a;numpy100题 文章目录 1. 导入numpy库并简写为 np (★☆☆)2. 打印numpy的版本和配置说明 (★☆☆)3. 创建一个长度为10的空向量 (★☆☆)4. 如何找到任何一个数组的内存大小&#xff1f; (★☆☆)5. 如何从命令行得到numpy中add函数的说明文档?…

Java虚拟机类加载机制探究:生命周期、初始化、使用与验证

一、java虚拟机与程序的生命周期 在如下几种情况之下&#xff0c;java虚拟机将结束生命周期&#xff1a; 执行了System.exit()方法程序正常执行结束程序在执行过程中遇到了异常或者错误而异常终止由于操作系统用出现错误而导致java虚拟机进程终止 二、类的加载&#xff0c;链…

javacc知识点

javacc的语法描述性文件以.jj结尾&#xff0c;一般情况下采用 1、option{JavaCC的选项} options部分&#xff0c;用于放置 JavaCC 的选项&#xff0c;常见option包括&#xff1a; STATIC&#xff1a;用于决定JavaCC生成的所有成员及方法是否被定义为static(注意&#xff1a;定义…

【算法Hot100系列】搜索旋转排序数组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

Pytorch张量通过索引获取指定数据

import torch x torch.tensor([1,2,3])x Out[3]: tensor([1, 2, 3])x[0] # 索引操作&#xff1a;取单个数字 Out[4]: tensor(1)x[0:1] # 切片操作&#xff1a;可以保持维度不变 Out[5]: tensor([1])x[torch.tensor([True,False,True])] # 布尔值索引&#xff0c;通过条件筛…

Xcode15 升级问题记录

这里写自定义目录标题 新版本Xcode15升级问题1&#xff1a;rsync error: some files could not be transferred (code 23) at ...参考 新版本Xcode15升级 下载地址&#xff1a;https://developer.apple.com/download/all/ 我目前使用的版本是Xcode15.2 我新创建了一个项目&…

uni微信小程序强制用户更新版本

强制更新的代码参考官方文档 uni.getUpdateManager() | uni-app官网 我这边的如下&#xff1a; //检查版本更新const updateManager uni.getUpdateManager();updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调console.log(res.hasUpdate, "是…

【JavaFX】JavaFX11开发踩坑记录

文章目录 技术栈踩坑记录 技术栈 JavaFX 11MavenJDK 11 踩坑记录 这些坑对于初学者很容易踩&#xff0c;JavaFX经常会报错空指针异常遇到其中一个问题可能就会消耗好几天的时间。 JavaFX 采用的是MVC架构设计&#xff0c;页面设计使用 fxml文件&#xff1b;业务逻辑采用Con…

部分城市公交站点数据,Shp+excel格式数据,2020年,几何类型为点

随着城市的发展和人口的增长&#xff0c;公共交通成为了人们出行的重要方式之一。而公交站点作为公共交通的重要组成部分&#xff0c;其数据信息的获取和分析对于城市规划和管理具有重要意义。 今天来分享一下部分城市公交站点数据&#xff1a; 首先先了解下该数据的基本信息 …

SOLIDWORKS2024新功能——SOLIDWORKS篇(一)

SOLIDWORKS2024新功能——SOLIDWORKS篇章节概括&#xff1a; • 切口工具 • 槽口延伸 • 戳记工具 • 薄片和槽口中的切割法线 切口工具 您可以使用切口工具在空心或薄壁圆柱体和圆锥体中生成切口。通过选择圆柱面或圆锥面上的边线&#xff0c;您可以将零件平展为钣金。 在…

加工零件的题解

目录 原题描述&#xff1a; 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 题目大意&#xff1a; 主要思路&#xff1a; 但是我们怎么才能判断出x走到1时L是偶数还是奇数呢&#xff1f; 初始化&#xff1a;…

test fuzz-05-模糊测试 kelinci AFL-based fuzzing for Java

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) test fuzz-01-模糊测试&#xff08;Fuzz Testing&#xff09; test fuzz-…