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

news2024/9/20 16:36:11

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.coloradmin.cn/o/1367586.html

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

相关文章

Vue-4、单向数据绑定与双向数据绑定

1、单向数据绑定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>数据绑定</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/…

进阶分布式链路追踪

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

C++面试宝典第16题:盛最多水的容器

题目 给定n个非负整数a1、a2、…、an,每个数代表坐标中的一个点(i, ai)。画n条垂直线,使得第i条垂直线的两个端点分别为(i, ai)和(i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:不能倾斜容器,且n的取值至少为2。 在下图中,垂直线代表的输…

时序预测 | Matlab实现GJO-VMD-LSTM金豺-变分模态分解-长短期记忆网络时间序列预测

时序预测 | Matlab实现GJO-VMD-LSTM金豺-变分模态分解-长短期记忆网络时间序列预测 目录 时序预测 | Matlab实现GJO-VMD-LSTM金豺-变分模态分解-长短期记忆网络时间序列预测预测效果基本介绍模型设计程序设计参考资料 预测效果 基本介绍 Matlab实现GJO-VMD-LSTM金豺-变分模态分…

【uniapp】调用阿里云OCR图片识别文字:

文章目录 一、效果&#xff1a;二、实现&#xff1a; 一、效果&#xff1a; 二、实现&#xff1a; 【阿里官方】高精版OCR文字识别【最新版】-云市场-阿里云 <template><view class"container"><!-- 选择图片 --><button click"imageO…

“单项突出”的赢双科技IPO加速,比亚迪是最强助力?

近日&#xff0c;新能源汽车核心部件供应商赢双科技首次递表科创板&#xff0c;其凭借旋转变压器产品就坐稳了新能源车企主要供应商的地位&#xff0c;从核心业务及业绩情况来看&#xff0c;赢双科技不愧为“单项冠军”。 据悉&#xff0c;赢双科技本次IPO拟募资8.47亿元&…

YOLOv5改进 | 2023Neck篇 | 利用Gold-YOLO针对小目标进行检测(附完整修改教程 + 代码)

一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…

【MIT 6.S081】2020, 实验记录(2),Lab: System calls

目录 TaskTask 1: System call tracing1.1 task 说明1.2 实现过程1.3 测试 这个实验尝试自己在 OS kernel 中添加 system call。 Task Task 1: System call tracing 1.1 task 说明 这个 task 实现在 kernel 中添加一个 trace 的系统调用&#xff0c;当用户调用这个系统调用…

Python语法进阶学习--模块和包

在学习python进阶知识中的面向对象之前,还要了解一下当中几个概念:包、模块、类和函数。 一.模块和包 模块和包:用来组织Python代码的。 包 > 含有 __init__.py文件的文件夹模块 > py文件类 > class 【面向对象学习】函数&#xff08;方法&#xff09;> def 以上均…

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能

陀螺仪LSM6DSV16X与AI集成.5--6D方向检测功能 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置6D方向检测功能配置选择滤波和角度阈值设置量程和速率获取所有中断源的状态发送相应信息演示 概述 陀…

计算机基础面试题 |18.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

大数据StarRocks(六) :Catalog

StarRocks 自 2.3 版本起支持 Catalog&#xff08;数据目录&#xff09;功能&#xff0c;实现在一套系统内同时维护内、外部数据&#xff0c;方便您轻松访问并查询存储在各类外部源的数据。 1. 基本概念 内部数据&#xff1a;指保存在 StarRocks 中的数据。 外部数据&#xf…

【QML COOK】- 003-处理鼠标事件

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {id: backgroudanchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"}MouseArea {anchors.fill: parentonClicked: backgroud.rot…

Python(30):非对称加密算法RSA的使用(openssl生成RSA公私钥对)

Python(30)&#xff1a;非对称加密算法RSA的使用(openssl生成RSA公私钥对) 1、openssl生成RSA公私钥对 1.1、生成RSA公私钥对命令 [rootloaclhost ~]# openssl OpenSSL> genrsa -out rsa_private_key.pem 1024 Generating RSA private key, 1024 bit long modulus .. ...…

微服务概述之单体架构

微服务概述 互联网始于 1969年美国的阿帕网&#xff08;ARPA&#xff09;&#xff0c;最开始的阿帕网只在美国军方使用。随着时间的推移&#xff0c;一些大学也开始加入建设&#xff0c;慢慢演化成了现在的因特网 &#xff08;Internet&#xff09;。随着计算机网络的普及&…

图像融合论文阅读:CrossFuse: 一种基于交叉注意机制的红外与可见光图像融合方法

article{li2024crossfuse, title{CrossFuse: A novel cross attention mechanism based infrared and visible image fusion approach}, author{Li, Hui and Wu, Xiao-Jun}, journal{Information Fusion}, volume{103}, pages{102147}, year{2024}, publisher{Elsevier} } 论文…

1.1map

unordered_map和map的使用几乎是一致的&#xff0c;只是头文件和定义不同 #include<iostream> #include<map>//使用map需要的头文件 #include<unordered_map>//使用unordered_map需要的头文件 #include<set>//使用set需要的头文件 #include<uno…

用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

大型语言模型&#xff08;LLM&#xff09;的出现带火了Agent。利用LLM理解人类意图、生成复杂计划并且能够自主行动的能力。Agent具有无与伦比的能力&#xff0c;能够做出类似于人类复杂性的决策和完成一些复杂的工作。 目前市面上已经出现非常多得Agent框架&#xff1a;XAgen…

如何使用PR制作抖音视频?抖音短视频创作素材剪辑模板PR项目工程文件

如何使用PR软件制作抖音视频作品&#xff1f;Premiere Pro 抖音短视频创作素材剪辑模板PR项目工程文件。 3种分辨率&#xff1a;10801920、10801350、10801080。 来自PR模板网&#xff1a;https://prmuban.com/37058.html

双向逆变器流程

逆变过程 反向充电过程 首先AC整流&#xff0c;然后经过LLC电路进行DC-DC转换&#xff0c;这样就可以给电池充电了。也就是市电通过上面的电路就可以存储到电池里面。能量存储到电池里面&#xff0c;后面需要用的时候&#xff0c;也可以通过一定电路把能量释放出来。这就是逆变…