C++CLI——4数组、泛型、集合与属性

C++CLI——4数组、泛型、集合与属性

C++数组

在c++中,数组的大小必须在编译时确定,并且将数组传递给函数时,传递的只是数组起始地址,所以要想办法连同数组大小一同传递给函数。

int arr[4] = { 1,2,3,4 };
int arr1[] = { 1,2,3,4 };
int arr2[2][3] //多维数组

动态创建数组

C++中直接声明数组需要明确数组的大小,但是可以使用new来动态创建数组,虽然这样数组也有固定的大小,只是在运行期间可以确定需要多少元素后再创建制定大小数组。

int* pa = new int[size];//size为运行时确定
delete [] pa;//不用时要释放

C++/CLI泛型

C#中具有泛型类型,C++/CLI中也具有泛型类型。

generic <typename T>
ref class Mylist
{
public:void Add(T obj);T GetAtIndex(int idx);
};//使用时制定泛型类型
Mylist<String^>^ lists = gcnew Mylist<String^>();

C++中的泛型模板和.net中的泛型虽然功能很相似,但是工作方式完全不同,所以在C++/CLR中都得到了支持。两者主要的不同之处有:

  1. 模版是在编译时就实例化好的,而泛型是在运行时仍然是泛型的;
  2. 模版支持特化、非类型模板参数和模版参数等,而泛型不支持,要简单的多;
  3. 泛型类型不能从类型参数继承,而模板可以;
  4. 泛型不支持元编程;
  5. 泛型类型支持类型参数约束,模板不支持。

托管数组

与C++不同,托管数组直接分配到堆上,首gc的管理,而且索引不再制定从某个地址偏移。并且要用Array关键字来声明。

array<int>^ arr1;
array<IntVal^, 2>^ arr2;//2维数组
//初始化
array<int>^ arr1 = gcnew array<int>(3) { 1, 2, 3 };
array<int>^ arr2 = gcnew array<int> {1, 2, 3};
array<int>^ arr3 =  {1,2,3};

对于引用类型的数组,实际上是句柄的数组。例如main函数int main(array<System::String^>^ args),实际上是String的句柄数组。另外.net提供了for each循环来遍历数组,与C#一样任何实现了IEnumberator接口的集合都可以使用for each

array<int>^ arr3 =  {1,2,3};for each (int s in arr3)
{Console::WriteLine(s);
}

多维数组

与C++不同,多维数组的维数要在尖括号中定义,且读取多维数组也要在一个方括号中添加索引。

array<int, 2>^ array2d = gcnew array<int, 2>(3, 3);
array2d[1, 2] = 3;
array<int, 2>^ array2d_1 = {{1,2,3},{4,5,6},{7,8,9}
};Console::WriteLine(array2d_1[0,1]);

List<T>

在实际开发过程中,更多的使用泛型集合类,因为集合可以改变大小。

using namespace System::Collections::Generic;List<int>^ lst = gcnew List<int>();
lst->Add(0);
lst->Add(1);
lst->Add(2);
List<int>^ lst = gcnew List<int>(10);//指定容量SortedList<String^, int>^ sl = gcnew SortedList<String^, int>();
sl->Add("a", 1044);

STL/CLR

​ STL容器是标准C++一部分,提供了一系列高性能、可扩展的集合类。C++/CLi提供了托管STL版本。使用方法与STL类似。

#include <cliext/vector>
using namespace System;
using namespace cliext;int main(array<System::String^>^ args)
{vector<double> v1;for (int i = 0; i < 10; i++){v1.push_back(i * 2);}for (vector<double>::iterator it = v1.begin();it!=v1.end(); it++){Console::WriteLine(*it);}Console::WriteLine("程序结束");
}

image-20240104135206092

属性

在.net中一般不会公开字段,而是公开属性。属性本身就是方法包含get和set。在C++/CLI中支持两种属性,标准量属性和索引属性。

标量属性

标量属性也就是最常见的属性,将私有字段使用属性保护起来,使用property来声明,而且可以根据需要只实现get以满足只读属性的要求。

ref class Person
{
public:property String^ Name{String^ get(){return name;}void set(String^ value){name = value;}}property int Age{int get(){return age;}void set(int value){age = value;}}
private:String^ name;int age;
};int main(array<System::String^>^ args)
{Person^ p = gcnew Person();p->Name = "小明";p->Age = 10;Console::WriteLine("{0}今年{1}岁", p->Name, p->Age);Console::WriteLine("程序结束");
}

image-20240104140941881

自动属性

在C#中是可以自动实现属性的如public int Order { set; get; } ,C++/CLI中同样可以:property String^ Name

属性继承

因为属性本质上就是方法,所以可以实现虚属性,以达到重写属性的目的。

public ref class Shape abstract
{
public:virtual property double Area;
};public ref class Circle:Shape
{
private:double r=1;
public:virtual property double Area {double get() override {return Math::PI * r * r;}}
};

属性索引

属性索引就是可以在对象上直接使用[]来访问,其工作方式与标量属性相似,只需要在属性名后面的方括中包含索引类型就可以

property double Name[int],这段代码定义的索引属性为Name,其索引类型为long,在get和set函数中的第一个参数必须为索引。

property double Name[int]
{double get(int idx){...}void set(int idx,double vlaue){...}
}double bal = a1->Name[10];//使用

如果使用defaut名称,可以在对象上直接访问

ref class Account
{
private:List<int>^ lst = gcnew List<int>();
public:Account(){lst->Add(1);lst->Add(2);lst->Add(3);lst->Add(4);lst->Add(5);lst->Add(6);}property int Value[int]{int get(int idx){return lst[idx];}}//使用default可以在对象上直接访问property int default[int]{int get(int idx){return lst[idx];}}
};int main(array<System::String^>^ args)
{Account^ a = gcnew Account();int s = a->Value[0];int ss = a[1];//使用default可以在对象上直接访问Console::WriteLine(s);Console::WriteLine(ss);Console::WriteLine("程序结束");
}

image-20240104152137180

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

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

相关文章

CodeWave智能开发平台--03--目标:应用创建--07供应商数据表格01

摘要 本文是网易数帆CodeWave智能开发平台系列的第09篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成07供应商数据表格 CodeWave智能开发平台的09次接触 CodeWave参考资源 网易数帆CodeWave开发者…

相机同步遇到的小问题

出现问题 在进行两个相机显示的时候&#xff0c;出现了相机显示不同步的情况&#xff0c;具体情况如下视频所示&#xff1a; 华睿/大华相机左右相机显示不同步 可以见到视频之中&#xff0c;右相机是比左相机更快一点的&#xff0c;但是有的时候就是同步的。我调用的代码是现成…

mdbook 使用 Rust 创建书籍的 Markdown 工具

当我们使用 markdown 编写文档时&#xff0c;目前有 gitbook&#xff0c;typora &#xff0c;以及一些 vscode 插件提供的 markdown 编辑插件&#xff0c;推荐一个开源实用的由 rust 官方维护的 mdbook。 官方仓库&#xff1a;https://github.com/rust-lang/mdBook 使用向导&a…

基于YOLOv5全系列参数模型【n/s/m/l/x】开发构建道路交通场景下CCTSDB2021交通标识检测识别系统

交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比&#xff0c;中国的交通标志有其独特的特点。卷积神经网络&#xff08;CNN&#xff09;在计算机视觉任务中取得了突破性进展&#xff0c;在交通标志分类方面取得了巨大的成功。CCTSDB 数据集是由长沙…

Centos7 静态连接失败解决

在 Linux 下有时候我们需要静态连接&#xff0c;但是静态连接会失败&#xff0c;失败的原因有几种&#xff1a; 1.没有相关的静态库文件 如果是没有相关的静态库文件&#xff0c;那么使用静态连接的话&#xff0c;就是下面的这种效果&#xff1a; 就是显示无法找到 .... 解…

搭建Github Page完全手册

一、前期准备 注册Github账号&#xff08;必备&#xff09;下载GitHub Desktop&#xff1a;下载链接&#xff08;可使用git代替&#xff09;模板选择网站&#xff1a; jekyllthemes.orggohugomademistakes 二、快速入门 1.模板参考 作者使用的模板来源&#xff1a;https://…

2024年最热门的15个科技工作岗位

1.系统安全管理员 系统安全管理员的任务是确保公司的网络、数据和系统免受网络安全威胁&#xff0c;方法是确保有适当的安全战略并保持最新的合规性和策略。 要求&#xff1a;应聘者应具有网络安全职位的工作经验&#xff0c;并对合规性和安全协议的最佳实践有坚实的基础&a…

阅读技巧总结

1、英语阅读中Skimming和Scanning的区别 Skimming&#xff1a;略读&#xff0c;即&#xff1a;不追求句子的细节含义&#xff0c;只求了解句子和段落想表达什么&#xff0c;摸清楚文章的主旨大意&#xff0c;也就是老外常说的&#xff1a;Reading for gist(主旨) Scanning&am…

文件批量改名,快速去除文件名中的空格,告别命名烦恼!

在日常工作中&#xff0c;我们经常遇到文件名中带有空格的情况&#xff0c;这不仅导致文件难以查找&#xff0c;还可能在某些软件中引发问题。那么&#xff0c;如何快速、有效地去除这些空格呢&#xff1f;今天&#xff0c;我就来教你一招&#xff01; 首先&#xff0c;我们要进…

LeeCode前端算法基础100题(16)- 轮转数组

一、问题详情: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4]…

【IEEE会议征稿通知】第五届计算机视觉、图像与深度学习国际学术会议(CVIDL 2024)

第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09; 2024 5th International Conference on Computer Vision, Image and Deep Learning 第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09;定于2024年4月19-21日…

银烧结设备研究分析:2025年将增长至2.58亿美元

银烧结设备是一种用于生产银浆的设备&#xff0c;广泛应用于电子、光伏、LED等领域。本文将从全球市场和中国市场两个方面进行分析其发展趋势。全球市场 全球银烧结设备市场规模在2019年约为2.09亿美元&#xff0c;预计到2025年将增长至2.58亿美元&#xff0c;复合年增长率为3.…

LeetCode刷题---两数之和

解题思路&#xff1a; 该题使用哈希表的思想解决该问题 首先定义一个Map&#xff0c;key为数组中的每个元素&#xff0c;value为每个元素的索引下标。接着遍历原数组&#xff0c;对每一个元素进行判断&#xff0c;如果哈希表中包含target-nums[i]&#xff0c;则将其value和当前…

【JAVA GUI+MYSQL]社团信息管理系统

本社团信息管理系统主要实现登录注册、管理员信息管理、社团用户信息管理、用户申请信息管理功能模块。 目录 &#xff11;&#xff0e;系统主要功能介绍 &#xff12;&#xff0e; 数据库概念模型设计 3.具体功能模块的实现 3.1模型类 3.1.1Student.java 3.1.2User .j…

基于ssm的孩童收养信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本孩童收养信息管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

【温故而知新】JavaScript的类型转换机制

一、概念 JavaScript的类型转换机制是指在特定的运算或操作中&#xff0c;将一种数据类型转换为另一种数据类型的过程。JavaScript的类型转换机制分为两种&#xff1a;隐式类型转换和显式类型转换。 隐式类型转换&#xff08;Implicit Type Conversion&#xff09;&#xff1a…

react-native下载图片到本地相册

需求 点击右上角下载icon&#xff0c;可以将当前图片下载并保存到本地相册。 下载的图片&#xff1a; 流程 下载图片的本质其实是&#xff0c; 固定需要下载的页面内容和样式 》将其放在当前页面不可见区域 》点击下载按钮 》穿一个ref给native&#xff0c;会自动拉起手机系…

SpringBoot怎么写一个自定义的starter,Gradle依赖引入starter的Jar包

1.新建一个Spring的项目myasset-spring-boot-starter 项目结构如下: 注意:不需要Application启动类 和 application.yml/application.properties文件 2. resources下添加spring.factories文件 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigu…

ECMAScript是什么?特性如何

ECMAScript是脚本语言的标准&#xff0c;包括JavaScript、JScript和ActionScript。它最广为人知的是JavaScript标准&#xff0c;旨在确保网页在不同Web浏览器之间的互操作性。它由Ecma International在文件ECMA-262中进行了标准化。 ECMAScript通常用于万维网上的客户端脚本&a…