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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

平仓是交易者功力的终极考验

这里的平仓主要针对盈利头寸的平仓&#xff0c;讨论了在什么情况下、如何平仓以使盈利最大化的问题。对于亏损头寸&#xff0c;反而更容易处理&#xff0c;只需在止损位将其平掉即可。开仓时需要考虑风险&#xff0c;平仓时则关注利润。所有风险都源于开仓&#xff0c;而所有利…

java火车查询管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web火车查询管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

Basal前端梳理

Basalt前端逻辑梳理 TBB安装参考 https://zhuanlan.zhihu.com/p/480823197 代码注释参考 https://blog.csdn.net/qq_39266065/article/details/106175701#t7 光流追踪参考 https://blog.csdn.net/weixin_41738773/article/details/130282527 VI Odometry KLT tracking 原理 …

【面试高频算法解析】算法练习2 回溯(Backtracking)

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…

C++ 学习笔记之运算符重载+案例

目录 一、C 运算符重载 二、定义一个成员函数或全局函数 三、计算时间 1.计算时间差 2.时间加减 四、一个运算符重载实例 一、C 运算符重载 是一种特性&#xff0c;它允许程序员重新定义已有的运算符的行为&#xff0c;以适应自定义类型的操作。通过运算符重载&#xff0…

LDD学习笔记 -- Linux字符设备驱动

LDD学习笔记 -- Linux字符设备驱动 虚拟文件系统 VFS设备号相关Kernel APIs动态申请设备号动态创建设备文件内核空间和用户空间的数据交换系统调用方法readwritelseek 写一个伪字符设备驱动在主机上测试pcd(HOST)在目标板上测试pcd(TARGET) 字符驱动程序用于与Linux内核中的设备…

MySQL 5.7.35下载安装使用_忘记密码_远程授权

文章目录 MySQL 5.7.35下载安装使用_忘记密码_远程授权MySQL下载地址mysql安装点击安装&#xff0c;最好以管理员身份运行选择自定义安装选择64位勾选启动自定义产品执行点击同意点击下一步点击执行下一步配置数据库端口号设置登录密码&#xff0c;如果密码忘记&#xff0c;下面…

考研护眼台灯哪种质量好?口碑好的五款台灯分享

相信各位家长朋友购买护眼台灯的初衷的都是为了更好的保护孩子眼睛&#xff0c;毕竟如今的孩子近视率真的非常高啊&#xff01;据目前的统计&#xff0c;我国儿童青少年总体近视率为52.7%&#xff0c;6岁儿童为14.5%&#xff0c;小学生为36.0%&#xff0c;初中生为71.60%&#…

JavaScript 对象及初始面向对象【万字长篇超宝典!】

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在在JavaScript 对象及初始面向对象以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在…

三维模型的几何坐标纠正应用探讨

三维模型的几何坐标纠正应用探讨 倾斜摄影三维模型数据的几何坐标纠正应用分析 近年来&#xff0c;倾斜摄影技术在三维数据采集设备中得到广泛应用。倾斜摄影技术通过在飞行平台上搭载多台传感器&#xff0c;从不同角度采集影像&#xff0c;相比传统的摄影测量&#xff0c;倾斜…

【网络】网络层协议ARP和IP协议转发流程

目录 一、IP概述 1.1 IP简介 1.2 IP协议 二、IP地址与硬件地址 三、地址解析协议ARP 3.1 ARP协议简介 3.2 ARP工作流程 3.3 ARP的四种典型情况 四、IP协议的转发流 一、IP概述 1.1 IP简介 IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址…

PHP表白网页制作网站源码

源码介绍 在线表白也不失为一种浪漫的方式&#xff0c;只要输入一些基本信息&#xff0c;就能自动生成表白页面。 可以设置购买网站会员来使用指定的网页制作模板&#xff0c;从而增加网站收入。 无需数据库即可使用&#xff0c;带有后台管理&#xff0c;可以设置指定域名&a…

css3 transform:scale

transform:scale 语法&#xff1a;transform:scale(x,y); <html> <head><style>.box1 {display: inline-block;width: 200px;height: 200px;background-color: pink;}.box2 {display: inline-block;width: 200px;height: 200px;background-color: red;tran…

各种锁的概述

乐观锁与悲观锁 悲观锁指对数据被外界修改持保守态度&#xff0c;认为数据很容易就会被其他线程修改&#xff0c;所以在数据被处理前先对数据进行加锁&#xff0c;并在整个数据处理过程中&#xff0c;使数据处于锁定状态。 悲观锁的实现往往依靠数据库提供的锁机制&#xff0…

Javaweb之Mybatis的XML配置文件的详细解析

2. Mybatis的XML配置文件 Mybatis的开发有两种方式&#xff1a; 注解 XML 2.1 XML配置文件规范 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在…

STL标准库与泛型编程(侯捷)笔记1

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

Windows:笔记本电脑设置休眠教程

前言 不知道大家在使用【Windows】笔记本有没有这个习惯&#xff0c;我会把他的电池选项的【休眠】设置进行打开。因为作为我们开发人员电脑一般是一周关一次机&#xff0c;有时候一个月关一次机。这时候【休眠】功能就给我们提供了一个好处&#xff0c;我们选择了【休眠】后电…

c++day5

#include <iostream>using namespace std;int blood10000; class hero { protected:string name;int hp;int attck; public://无参构造hero():attck(500){}//有参构造hero(string name,int hp,int attck):name(name),hp(hp),attck(attck){}//虚成员函数virtual void Atk(…

VMware Workstation——修改虚拟机配置和设置网络

目录 一、修改配置 1、点击需要修改配置的虚拟机&#xff0c;然后点击编辑虚拟机配置 2、修改内存、CPU、硬盘配置 二、设置网络 1、从虚拟机配置中进入到网络适配器设置 2、选择网络连接模式 一、修改配置 1、点击需要修改配置的虚拟机&#xff0c;然后点击编辑虚拟机配…

python自动化测试面试题与答案汇总

对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范…