结构体和类的比较
STM32枚举类型和结构体的使用

STM32枚举类型和结构体的使⽤结构体就是⼀个可以包含不同数据类型的⼀个结构,它是⼀种可以⾃⼰定义的数据类型。
⾸先结构体可以在⼀个结构中声明不同的数据类型。
第⼆相同结构的结构体变量是可以相互赋值的,⽽数组是做不到的,因为数组是单⼀数据类型的数据集合,它本⾝不是数据类型(⽽结构体是),数组名称是常量指针,所以不可以做为左值进⾏运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组⼤⼩完全相同。
第三,节省内存空间第四,⾼效率。
枚举⼯作模式:typedef enum{GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode */GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode */GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode */GPIO_Mode_AN = 0x03 /*!< GPIO Analog In/Out Mode */}GPIOMode_TypeDef ;枚举⼯作速度:typedef enum{GPIO_Speed_Level_1 = 0x01, /*!< Medium Speed */GPIO_Speed_Level_2 = 0x02, /*!< Fast Speed */GPIO_Speed_Level_3 = 0x03 /*!< High Speed */}GPIOSpeed_TypeDef ;定义结构体类型:typedef struct{GPIOMode_TypeDef GPIO_Mode ;GPIOSpeed_TypeDef GPIO_Speed ;}GPIO_InitTypeDef ;定义初始化结构体变量及赋值:GPIO_InitTypeDef GpiocInit; //定义变量GpiocInit.GPIO_Mode = GPIO_Mode_IN; //变量赋值GpiocInit.GPIO_Speed = GPIO_Speed_Level_2;形参为结构体的函数定义:GPIO_Init(GPIO_InitTypeDef init);形参为结构体的函数:GPIO_Init(GPIO_InitTypeDef init){x = init.GPIO_Mode ; // x = 0x00y = init.GPIO_Speed ; // y = 0x02}形参为结构体变量的函数调⽤:GPIO_Init(GpiocInit) ;例2:定义字符库结构体:typedef struct typFNT_ASC16{char Index[1];char Msk[16];}ZiFuKu;结构体幅值const ZiFuKu ASC_16[] ={"1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00, "2",0x00,0x00,0x08,0x04,0x84,0x44,0x38,0x00,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x00, "3",0x00,0x00,0x08,0x04,0x44,0x44,0xB8,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x03,0x00, "4",0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x00,0x00,0x01,0x01,0x05,0x07,0x05,0x00 }。
定义结构体

定义结构体结构体是计算机语言中定义一组具有多个数据成员的组合体,它可以根据定义安排不同的数据类型和数据项的结构。
结构体内存储的类型可以是内置的或用户自定义的,比如:原始C语言类型(字符串,整数,浮点数),用户自定义的结构体,甚至可以是指向其他结构体的指针类型。
结构体的定义方式多种多样,不同的编程语言有不同的定义方式。
在C语言中,结构体的定义需要使用“struct”关键字,后跟结构体名,然后跟一对花括号,花括号中包含结构体成员的定义。
例如:struct myStruct {int a;double b;char c;};在C++和Java语言中,结构体可以用class定义,并可以添加自定义的构造函数和析构函数,给结构体添加一些自定义的行为:class myClass {int a;double b;char c;public:myClass(int a_, double b_, char c_):a(a_), b(b_), c(c_){ }~myClass(){ }};结构体可以定义它的内存分布,比如结构体可以按照它的成员分布在不同的内存位置。
它也可以定义一系列的函数,这些函数可以用于初始化,对结构体中的元素进行访问,甚至和其他结构体进行比较和操作。
结构体的优点是:它可以将相关的数据进行组织,有效地利用内存,提高程序的运行效率。
结构体还可以为复杂的结构设计提供实现方案,像是集合可以用结构体和指针来实现,链表也可以用结构体实现。
结构体可以进行封装,将它的成员和操作封装起来,使程序的使用更方便,也可以加大程序的可移植性,结构体中定义的数据可以利用其他语言中提供的特性,例如C++中的STL容器,Java中的集合等,可以更方便地实现结构体的存储和访问。
结构体和类的区别在于:结构体不能拥有自定义的行为,而类可以。
结构体的数据成员可以任意访问,而类中的数据成员会隐藏起来,只能通过特定的函数来访问。
结构体在内存中是连续的,而类的对象是分开的,每个类的对象都会有一个单独的存储区域。
类和结构体的区别

类和结构体的区别1. class和structure很相似,从技术层面讲,class是引用,而structure则是数值.有人很形象的说class里有行动,方法,成员,是有机体的结合,而structure则是活生生的有机体,2. 通俗的理解,class包涵structure, class里有方法拉,成员拉,什么滴,而structure只有数据,二 .类与结构的差别%%%类成员默认是private,而结构体默认是 public。
1.值类型与引用类型结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用注:1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用2.继承性结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样例如:结构实现接口interface IImage{void Paint();}struct Picture : IImage{public void Paint(){// painting code goes here}private int x, y, z; // other struct memb ers}3.内部结构:结构:没有默认的构造函数,但是可以添加构造函数没有析构函数没有 abstract 和 sealed(因为不能继承) 不能有protected 修饰符可以不使用new 初始化在结构中初始化实例字段是错误的类:有默认的构造函数有析构函数可以使用 abstract 和 sealed有protected 修饰符必须使用new 初始化三.如何选择结构还是类讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。
c结构体与类的区别

c结构体与类的区别一、结构体和类非常相似:1.定义方式:public struct Studentstring Name;int Age;}public class Questionint Number;string Content;}2,两者都是container类型,这表示它们可以包含其他数据类型作为成员。
3,两者都拥有成员,包括:构造函数、方法、属性、字段、常量、枚举类型、事件、以及事件处理函数。
4,两者的成员都有其各自的存取范围。
例如,可以将其中一个成员声明为Public,而将另一个成员声明为Private。
5,两者都可以实现接口。
6,两者都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量。
7,两者都可以声明和触发事件,而且两者都可以声明委托(Delegate)。
二、结构体和类的主要区别1,结构是实值类型(Value Types),而类则是引用类型(Reference Types)。
2,结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。
3,所有结构成员默认都是Public,而类的变量和常量数则默认位Private,不过其他类成员默认都是Public。
4,结构成员不能被声明位Protected,而类成员可以。
5,结构变量声明不能指定初始值、使用New关键字货对数组进行初始化,但是类变量声明可以。
6,结构不能声明默认的构造函数,也就是不拥有参数的非共享构造函数,但是类则无此限制。
7,二者都可以拥有共享构造函数,结构的共享构造函数不能带有参数,但是类的共享构造函数则可以带或者不带参数。
8,结构不允许声明析构函数(Destructor),类则无此限制。
9,结构的实例(Instance)声明,不允许对包含的变量进行初始化设定,类则可以在声明类的实例时,同时进行变量初始化。
10,结构是隐式继承自ValueType类,而且不能继承任何其他类型,类则可以继续自ValueType以外的任何类。
c++ 结构operator用法

c++ 结构operator用法摘要:1.C++结构体的概述2.结构体的成员访问和修改3.结构体的运算符重载4.结构体的函数成员5.结构体与类的异同正文:C++结构体是一种聚合数据类型,它可以将多个不同类型的数据组合在一起。
结构体主要应用于以下场景:表示对象的属性和方法、表示数组或指针的尺寸和类型、表示函数的参数和返回值等。
本篇文章将详细介绍C++结构体的相关知识,包括结构体的成员访问和修改、运算符重载、函数成员以及结构体与类的异同。
首先,我们来了解结构体的成员访问和修改。
结构体的成员可以通过点运算符(.)或箭头运算符(->)进行访问和修改。
例如,定义一个表示点的结构体Point,其中包含x 和y 坐标,可以通过以下方式访问和修改成员变量:```cppstruct Point {int x;int y;};int main() {Point p1;p1.x = 1;p1.y = 2;cout << "P1( " << p1.x << ", " << p1.y << " )" << endl;return 0;}```接下来,我们介绍结构体的运算符重载。
当结构体中包含运算符重载函数时,需要使用友元声明。
例如,定义一个表示复数的结构体Complex,其中包含实部和虚部,可以重载+、-、*、/等运算符:```cppstruct Complex {double real;double imag;public:friend double Complex::operator+(const Complex& c1, const Complex& c2);friend double Complex::operator-(const Complex& c1, const Complex& c2);friend double Complex::operator*(const Complex& c1, const Complex& c2);friend double Complex::operator/(const Complex& c1, constComplex& c2);};```然后,我们讨论结构体的函数成员。
类与结构体的区别

区别有三:1: 类可以继承,结构不可以.2: 类是引用类型,结构是值类型3: 类在堆中,结构在栈分配内存二 .类与结构的差别1.值类型与引用类型结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构,通过使用结构可以创建更多的值类型类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用注:1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用2.继承性结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样例如:结构实现接口interface IImage{void Paint();}struct Picture : IImage{public void Paint(){// painting code goes here}private int x, y, z; // other struct members}3.内部结构:结构:没有默认的构造函数,但是可以添加构造函数没有析构函数没有abstract和sealed(因为不能继承)不能有protected修饰符可以不使用new初始化在结构中初始化实例字段是错误的类:有默认的构造函数有析构函数可以使用abstract和sealed有protected修饰符必须使用new初始化三.如何选择结构还是类讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。
c类与结构体的异同

c类与结构体的异同C语言中的结构体和类是两种重要的数据类型,它们在定义和使用上有许多相似的地方,但也存在一些不同点。
下面从几个方面来探讨一下C类与结构体的异同。
一、定义方式结构体定义的方式与类的定义方式非常接近,都是通过关键字struct和class进行声明定义。
但是结构体定义中没有类中的访问修饰符(public、protected、private),并且结构体的成员变量默认为public类型。
二、成员变量C语言中的结构体和C++中的类都可以包含成员变量,但C++的类有访问限制符(public、protected、private)。
而结构体中写不写关键字public、protected、private都没有影响,结构体的成员变量默认被视为公共成员。
三、成员函数C++中的类具有自定义的成员函数,而C语言中的结构体是不支持成员函数的。
不过C语言中可以使用指向函数的指针来模拟实现成员函数的效果。
四、继承C语言中的结构体不支持继承,而C++中的类支持继承。
在C++中,通过继承可以使得类之间的关系更加清晰和简单,还能够方便地实现代码复用。
五、实例化C++中的类必须实例化成对象之后才能使用,而结构体不需要进行实例化。
在C语言中,可以直接定义一个结构体变量,并且可以直接访问结构体中的成员变量。
而C++中,需要通过定义一个类的对象才能使用类中的成员变量和函数。
六、运算符重载C++中的类支持运算符重载操作,而C语言中的结构体不支持这一操作。
通过运算符重载,可以使类的对象在使用运算符进行操作的时候更加的灵活和方便,提高了代码的可读性和可维护性。
总结:从定义方式、成员变量、成员函数、继承、实例化以及运算符重载等方面来比较C类和结构体之间的异同,不难发现,C语言中的结构体更加的简单和直观,而C++中的类更加的灵活和强大。
对于选择使用哪种数据类型,我们需要根据不同的开发需求和场景来选择。
结构体和类的比较

结构体和类的比较1.目的和用途:结构体(struct)和类(class)的设计和用途略有不同。
结构体主要用于封装一组相关的数据,而类则更加复杂,可以封装数据和行为(即函数)。
结构体通常用于创建简单的数据对象,而类用于创建更复杂的对象,且具有更强的封装性。
2.成员变量和方法:类和结构体都可以包含成员变量和方法,但是类的成员变量和方法可以是公有的(public)、私有的(private)或受保护的(protected),而结构体的成员变量和方法默认是公有的,除非特别指定为私有的。
3.继承:类可以进行继承,这意味着一个新的类可以从一个现有的类派生出来,继承它的属性和行为。
这使得类可以更好地组织和重用代码。
结构体不能直接进行继承。
4.实例化和使用:类可以通过实例化来创建多个对象,每个对象都有自己的状态和行为。
而结构体通常是作为值类型使用,可以直接创建并使用,而不需要实例化。
这意味着结构体可以更高效地使用内存空间。
5.默认构造函数和析构函数:类在创建对象时可以有默认构造函数和析构函数,而结构体则没有默认构造函数和析构函数。
类的构造函数用于初始化对象的状态,析构函数则用于清理对象的资源。
6.指针和引用:类的对象可以使用指针和引用来操作,这使得对象的操作更加灵活。
结构体也可以使用指针和引用来操作,但是通常更多地以值的形式传递和使用。
7.内存布局:结构体的内存布局是连续的,即所有成员变量在内存中的存储位置是按顺序排列的。
类的内存布局是分散的,即成员变量和函数的存储位置是分开的。
8.性能和效率:因为结构体是按值传递的,所以它们更有效地使用内存,并且在一些情况下可以提高程序的性能。
而类通常需要通过指针或引用传递,这会导致一些额外的开销和性能损失。
结构体和类是编程中非常重要和有用的概念,可以根据具体需求来选择使用哪种方式。
如果只需要简单地封装一组相关的数据,并且不需要过于复杂的行为和功能,可以使用结构体。
而如果需要更复杂的数据和逻辑操作,包括继承、多态、封装等特性,就应当选择类来实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构是一种用关键字struct声明的自定义数据类型。
与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。
1.结构的构造函数和类的构造函数不同。
2. a.结构不能包含显式的无参数构造函数。
结构成员讲自动初始化为它们的默认值。
b.结构不能包含以下形式的初始值设定类:base(argument-list);
2.对于结构中的实例字段成员,不能在声明时赋值初始化。
3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。
如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。
但是,结构从基类OBJECT继承。
结构也可以实现接口。
5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。
每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。
结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。
正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。
在结构超出了作用域被删除时,速度也很快。
另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。
这样,就会有性能损失,根据结构的大小,性能损失也不同。
注意,结构主要用于小的数据结构。
但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。
另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。
class和struct有且仅有一个区别,那就是对于class说明的类成员,函数也好,变量也好,如果没有指定类型,缺省是private限定的。
而对于struct,则是public的。
结构体数组效率比类数组效率高(不需要装箱合拆箱)。
结构体集合(如Hashtable)效率比类集合效率低。
集合的元素是引用类型,所以结构体必须进行装箱和拆箱处理。
所以类在大的集合中更有效率。