结构体与类

深入理解C#结构体与类的区别与用法 本文通过分析C#中的结构体(struct)与类(class)的不同使用场景和特性,探讨了它们在内存分配、构造函数、析构函数以及如何包含方法和属性等方面的区别。文章还介绍了枚举器(enumerators)的使用方法,通过示例代码和内存存储图示,帮助读者更清晰地理解这些复杂数据类型的概念。 阅读详情
先来说说C和C++中结构体的不同
a) C语言中的结构体不能为空,否则会报错
1>d:\myproject\visual studio 2013\projects\myc++\main.c(71): error C2016: C 要求一个结构或联合至少有一个成员
b) C语言中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的。换句话说就是C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数, C++中的结构体和类体现了数据结构和算法的结合。
不过虽然C语言的结构体中不能定义成员函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针,所以总的来说C语言中的结构体只是一个复杂数据类型 ,只能定义成员变量,不能定义成员函数,不能用于面向对象编程。来看一个函数指针的例子:
[cpp]  view plain  copy
  1. int My_Add(int a, int b)  
  2. {  
  3.     return a + b;  
  4. }  
  5. int My_Sub(int a, int b)  
  6. {  
  7.     return a - b;  
  8. }  
  9. struct  CTest  
  10. {  
  11.     int(*Add)(int, int); //函数指针  
  12.     int(*Sub)(int, int);  
  13. };  
  14.   
  15. int main()  
  16. {  
  17.     struct CTest test;  
  18.     int ret = 0;  
  19.     test.Add = My_Add;  
  20.     test.Sub = My_Sub;  
  21.     ret = test.Add(3, 5);  
  22.     printf("%d", ret);  
  23. }  

c) 比如说这个结构体吧:

[cpp]  view plain  copy
  1. struct  CTest  
  2. {  
  3.     char ch;  
  4.     int num;  
  5. };  
  6. int main()  
  7. {  
  8.     CTest test;  
  9.     test.num = 1;  
  10.     printf("%d", test.num);  
  11. }  

这样在C语言中是编译不过去的,原因提示未定义标识符CTest。总的来说就是在C语言中结构体变量定义的时候,若为struct 结构体名 变量名定义的时候,struct不能省略。但是在C++之中则可以省略struct。

再来分析C++中的结构体与类的区别:
先来说说C++中两者的相同之处:  结构体中也可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。总的一句话: class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。

再来说说两者的区别:对于成员访问权限以及继承方式,(1)class中默认的是private,而struct中则是public。
(2)class还可以用于表示模板类型,struct则不行。
注意struct是可以继承与被继承的,这一点有的人可能忽略了,来看一下struct中的继承与被继承:
[cpp]  view plain  copy
  1. struct A  
  2. {  
  3. public:  
  4.     A(){};  
  5.     virtual void Dynamic()  
  6.     {  
  7.         cout << "A" << endl;  
  8.     }  
  9. protected:  
  10.     void fun();  
  11. private:  
  12.     int m_Data;  
  13. };  
  14.   
  15. struct B:public A  
  16. {  
  17. public:  
  18.     virtual void Dynamic()  
  19.     {  
  20.         cout << "B" << endl;  
  21.     }  
  22. };  
  23. int main()  
  24. {  
  25.     A * pa = new B;  
  26.     pa->Dynamic();  
  27. }  
编译完全没有问题。

总结一下就是:
概念: class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做 到,但class能做到的stuct却不一定做的到。
类型:struct是值类型(在栈上),class是引用类型(在堆上),因此它们具有所有值类型和引用类型之间的差异。
效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为 基类型对待的小对象,而class来处理某个商业逻辑。
关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函 数,不能使用abstract和protected等修饰符,不能初始化实例字段。
(1)class中默认的是private,而struct中则是public。
(2)class还可以用于表示模板类型,struct则不行。

拓展部分:再来看一看 Java之中类和结构体的区别,来看一个例子:
代码:
[cpp]  view plain  copy
  1. static void Main(string[] args)  
  2.         {  
  3.             int strNumberA = 100;  
  4.             int strNumberB = strNumberA;//编译器会先复制strNumberA的值,后赋给strNumberB,会在内存的两个地方储存值100  
  5.   
  6.             MyVector vA = new MyVector();  
  7.             MyVector vB = vA;//引用变量的赋值 赋值操作完成后,两个变量都指向同一内存地址   
  8.             vA.Value = 100;  
  9.             Console.WriteLine(vA.Value + "  等于  " + vB.Value);//由于vA和vB指向同一内存地址,所以vB.Value的值也为100    
  10.             vB.Value = 200;  
  11.             Console.WriteLine(vA.Value + "  等于  " + vB.Value);//同理vA.Value =vB.Value   
  12.                
  13.             MyStruct structA = new MyStruct();  
  14.             MyStruct structB = structA; //结构是值类型 赋值操作完成后,两个结构中的结构信息一致。注意是“结构中的信息”一致。   
  15.             structA.Value = 100;  
  16.             structB.Value = 200;  
  17.             Console.WriteLine(structA.Value + "  不等于  " + structB.Value);//同理vA.Value !=vB.Value   
  18.             Console.Read();  
  19.         }  
  20.         private class MyVector  
  21.         {  
  22.             public int Value { get; set; }  
  23.         }  
  24.         private struct MyStruct  
  25.         {  
  26.             public int Value;  
  27.         }    
  28.    

例子可以看出,值类型变量的赋值操作,仅仅是2个实际数据之间的复制。而引用类型变量的赋值操作,复制的是引用,即内存地址,由于赋值后二者都指向同一内存地址,所以改变其中一个,另一个也会跟着改变。
结构体引出的问题:上面说到值类型的内存不由垃圾回收控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常 struct比class更高效;而引用类型的内存回收 ,有垃圾回收机制控制。这就引出了关于.NET内存中的堆和栈的讨论 。

最后做一个小小的总结:
关于 Class性能好还是Struct性能好(换言堆性能好?还是栈性能好?)  那么什么时机该用呢 ,比较struct和 class的不同,我 使用一下网上的一个牛人总结的比较好的一段话:
(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。
(2) 在表示数据量大、逻辑复杂的大对象时,首选class。
(3) 在表现抽象和多级别的对象层次时,class是最佳选择 

http://blog.youkuaiyun.com/loving_forever_/article/details/51483828

AI+Xmind自动生成测试用例(思维导图格式) 最后:我是Walker,一个热爱分享编程知识的程序员,希望能够帮助到你! 阅读详情

相关推荐

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体、球体和网格,实现了物体的旋转、缩放、平移和灯光效果。附有项目完整代码,有详细注释。适合初学者熟悉opengl使用。

张竞成的博客 1万+

Java知识点复习

最近考Java所以做了点java题复习,总结归纳出一些易错点。 1.下列叙述哪些是正确的? A.final类不可能有子类 B.abstract类中只能有abstract方法 C.abstract类中可以有非abstract方法,但该方法不可以用final修饰。 D.不可以同时用final和abstract修饰一个方法。 #AD 解析:对于B,C,abstract类中可以有非abstract方法,但...

Charles6665的博客 1739

从零到一:RF-DETR如何通过神经架构搜索重塑实时目标检测的边界

RF-DETR通过创新的权重共享神经架构搜索(NAS)机制,重新定义了实时目标检测的技术边界。这项技术在COCO等基准测试中表现卓越,成为首个AP超过60的实时检测器,同时保持跨领域稳定性和高效推理速度。RF-DETR的动态架构调整能力使其能够适应从嵌入式设备到云端服务器的各种硬件环境,为工业质检、自动驾驶等场景提供灵活解决方案。

weixin_29061531的博客 469

C-struct/union/enum

在C语言中,要求一个结构或联合至少有一个成员,enum无所谓。 struct A//报错,C 要求一个结构或联合至少有一个成员 { }; union B//报错,C 要求一个结构或联合至少有一个成员 { }; enum C//ok { };//enum C的大小仍旧为4 struct A { char a; int b; }; union B { char a; int b; };...

chirrupy_hamal的博客 759

SAP 关于WPS上传文件提示“文档中不包含数据“ 和“程序正在运行中“处理办法

最近这一周经常有用户反馈,使用WPS上传文件系统报错,一直提示“程序正在运行中”,另外在导入数据的时候提示"文档中不包含数据",跟进运维过程中遇到的这两种情况,分享一下处理的办法,如果各位更好的办法也可以给我留言分享。

我小时候很黑的博客 2855

FreeRtos——10、全局看门狗设计

RTOS 里的看门狗不只是为了证明 CPU 还在动,而是为了证明每个业务逻辑都在按预期的节奏“呼吸”。

qq_40170041的博客 901

一个c语言语句中至少包含一个,数据结构中遇到的有关问题error C2016: C 要结构或联合至少有一个成员...

数据结构中遇到的问题error C2016: C 要求一个结构或联合至少有一个成员代码是:请大神们赐教#include#include#include#defineLIST_INIT_SIZE100#defineLISTINCREMENT10structElemType{charcityname[20];intnumber;charintroduct[20];};typedefs...

weixin_28815535的博客 1160

[小梅哥FPGA] 如何通过动态重配置实现FPGA时钟的实时频率/相位/占空比调整?

PLL和MMCM是实际存在的硬件电路,用以对输入时钟的负面变化,如抖动、频率变化、相位偏移、占空比失真等进行处理。基于该表,用户在初始化Clk_Wiz后,只需要计算好所需的频率、相位、占空比对应的设置值,使用Xil_Out32函数配置对应寄存器即可。通过上述步骤,在平时的开发调试过程中,亦或是一些对于时钟可能有着实时性要求的设计(如数据采集、图像处理)里,我们便可以在无需重新修改设计的前提下,通过AXI4总线来完成对时钟频率、相位的调控,从而达到缩短设计周期以及让设计适应更多场景的目的。

zgmxs的专栏 2495

解决“from sha3 import keccak_256“包引用问题

    sha3包是用C语言编写的计算字符串哈稀的包,在win10上安装时需要使用VS2017编译成python格式,再进行安装,但这个包已经5年没有更新了,并且在win10上安装时,报"sha3.c(33): error C2016: C 要求一个结构或联合至少有一个成员"错误。     解决方法:使用等效的包 eth-utils 替换 sha3 1 安装eth_utils pip install eth-utils==1.10.0 2 修改包引用与函数调用方式     修改包引用: from s

sanqima的专栏 1734

Matplotlib之bar3d画3D柱状图

3D柱状图通常用于展示数据集中不同分类项的数据大小或数量。与普通的柱状图相比,3D柱状图更适合展示数据的三个维度 3D 柱状图 按行/列涂颜色 柱加阴影、描黑边 自定义座标轴名、刻度标签、范围

我走的每一步都算数 1122

昇腾,Ascend,NPU,mindie,镜像,部署vllm:第5篇,昇腾环境下部署蒸馏版deepseek-r1,并在dify中注册模型供应商

这两天没少折腾deepseek-r1。之前在A100上用ollama部署了一份DeepSeek-R1-Distill-Qwen-32B,感觉真的特别慢。现在,再用昇腾部署一遍,看看速度能不能更快。p.s. 类似的内容其实已经写了很多遍了。但感觉之前写得都太碎,不够顺畅。接着新模型写篇长文,把能包括的都包括进来。这样大家也不需要到处翻来翻去。

xiezhipu的博客 2450

C++中结构体与类的区别介绍

在参与以C++为编程基础的项目应用中总会遇到结构体类型与类的数据类型,但是其具体应用区别模糊不清 现将其区别总结如下,欢迎补充共同学习(先介绍C和C++中结构体的不同,再对比C++中结构体与类的区别) 一、C和C++中结构体的不同 (1)C语言中的结构体不能为空,否则会报错 C语言中要求一个结构或联合至少有一个成员。C语言中,空结构体的大小为0,而C++中空结构体(属于空类)的大小为1 ...

Gary_ghw的博客 1万+

2026华为OD面试题084:贪心的商人

商人经营一家店铺,有 `number` 种商品。由于仓库限制,每件商品的最大持有数量是 `item[index]`。 每种商品每天有一个价格 `item_price[item_index][day]`。通过对商品买进和卖出获取利润,请给出商人在 `days` 天内能获取到的最大利润。 注:同一件商品可以反复买进和卖出。 输入描述: - 第一行输入商品数量 `number` - 第二行输入商人售货天数 `days` - 第三行输入 `number` 个整数,表示每件商品的最大持有数量 `item[in

琅嬛福地 274

【C++】类与结构体的区别

我们知道C++中的 struct 对C中的 struct 进行了扩充,它不再是只能用来封装不同类型数据的数据结构了,而是拥有了更多的功能,例如:**可以包含成员函数,可以继承,可以实现多态!!**,这些功能与C++中的类很相似。 那么接下来我们解剖一下C++中结构体struct与类class的区别。 **struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体!**

ly_6699的博客 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C#中结构体与类的区别

结构是一种关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等。不过,结构是值类型,类是引用类型。   结构体和类的区别 1、值类型与引用类型 结构体是值类型:值类型在栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32结构,通过使用结构可以创建更多的值类型。 类是引用类型:引用类型在堆上分...

5498

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++:类与结构体

在C语言中,定义结构体变量的定义同带着struct关键字而在C++中结构体变量的的定义可以不使用struct关键字C语言 //typedef struct Node Node;//... };结构体变量定义: struct Node L;//... };结构体变量定义:Node L;当然C语言也可以使用typedef来把结构体类型重新起名,但C++的结构体可以直接省略在C++中结构体与类区别不大类定义对象也叫做实例化类的实例化就是给每个对象开空间定义对象的时候才会在这对象里面定义里面的变量。

winterright的博客 1403

C++中的结构体与类

C++中结构体也有权限,但权限只有一种:public,且不能存放函数, 类有三种权限,且能放函数

takashi77的博客 6550

类与结构体的区别

结构体是值类型,类是引用类型 结构体成员不能从其他类或结构体继承,类可以(注意,所有的值类型都默认从ValueType类继承,ValueType类再从Object类继承。所以结构体对象仍然拥有超类Object的成员)。 结构体成员不能在声明时赋值初始值,类可以(实际上,C#类成员初始化代码会被编译器放到构造函数中的最前边部分执行,而C++中根本没有这种方式,只能声明成员) 不能为结构体提供无参构...

由纪的博客 1万+

结构体与类的异同

结构体与类的异同: 相同之处: C++中的结构体中可以包含函数,也可以定义public、private、protected数据成员;定义了结构体之后,可以使用结构体名来创建对象,但是C中的结构体不允许含有函数;即 在C++中,结构体中可以有成员变量,成员函数,可从别的类继承,也可以被别的类继承,可以含有虚函数; 不同之处: 结构体定义中默认情况下的成员是public,而类定义中的默认情况的成员是private的; 类中的非static成员函数有this指针(C++的结构体的非static

weixin_44018363的博客 1216

Swift —— 类与结构体

Swift —— 类与结构体1. 初识类与结构体1.1 异同点1.2 类(引用类型)1.3 结构体 (值类型)1.4 类和结构体的内存位置1.4.1 结构体的内存位置1.4.2 类的内存位置2. 类的初始化器2.1 指定初始化器&便捷初始化器2.2 可失败初始化器2.3 必要初始化器3. 类的生命周期3.1 SIL文件分析3.2 类的初始化流程 1. 初识类与结构体 1.1 异同点 结构体和类的主要相同点有: 定义存储值的属性 定义方法 定义下标以使用下标语法提供对其值的访问 定义初始化器 使用

LinShunIos的博客 2327

C++的类与C语言结构体比较

C++的类与C语言结构体比较 一、结构体,类的介绍 1.C语言的结构体 由于普通数据分配内存不集中,寻址效率不高,而且对数组赋初值时容易发生错位,结构零散不易管理。 所以诞生了结构体这一种数据类型,它由若干成员组成,每一个成员可以是一个基本数据类型,也可以是一个构造数据类型。 比如最简单一个结构体数据类型: struct student//结构体名称为student { char name[20]; int nYear; struct date { int day; }db; //db是s

share something here 2443

C#中类与结构体的区别、结构体与枚举的区别详解

​特性​类(Class)​​结构体(Struct)​​枚举(Enum)​​类型引用类型值类型值类型​内存分配堆栈栈​继承支持不支持不支持​适用场景复杂对象、需多态轻量数据、高性能需求有限状态、可读性优先选型原则优先用类实现业务逻辑主体。对小型数据(<16字节)且高频实例化的场景(如游戏开发),选择结构体。需明确语义的常量集合(如状态码),使用枚举替代魔数(Magic Number)

品质生活,极致编程。 651

C#结构体与类的异同之处

结构体:结构体和类基本是一样的,相同点是:可以写字段、属性、方法,可以被实例化;不同点是:结构体是在栈上开辟空间、而类是在堆上开辟空间,所以结构体是值类型不是引用类型。 结构体语法:访问权限修饰符+struct+结构体名称{} 【注意事项】引用类型传给形参是传地址,所以修改值就是对他的修改;而值类型形参的修改值与他本身没有关系。因此,以下代码打印结果: public struct PointStr...

SCscHero的博客 784

C++中结构体与类的区别

金头盔飞行员蒋佳冀:知道了不行,熟悉也不够,要真正进入潜意识,成为条件反射才行。 C++中结构体与类的区别(结构不能被继承,默认是public,在堆栈中创建,是值类型,而类是引用类型)good ...

博雅勇士的博客 959
上一篇: 堆和栈的区别(转)
下一篇: EEPROM和flash的区别 及 nor flash和nand flash
microlyc
博客等级 码龄9年 10粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值