这个问题已经在C#/。Net上下文中提出过 。 程序员
如今,我想学习C ++中的结构和类之间的区别。 请讨论技术差别以及在OO设计中选择一个或另外一个的缘由。 ide
我将从一个明显的区别开始: 函数
public:
或private:
:,则结构的成员默认为public; 默认状况下,类的成员是私有的。 我确信在C ++规范的晦涩之处能够找到其余差别。 学习
class A{ public: int i; }; class A2:A{ }; struct A3:A{ }; struct abc{ int i; }; struct abc2:abc{ }; class abc3:abc{ }; int _tmain(int argc, _TCHAR* argv[]) { abc2 objabc; objabc.i = 10; A3 ob; ob.i = 10; //A2 obja; //privately inherited //obja.i = 10; //abc3 obss; //obss.i = 10; }
这是在VS2005上。 spa
。 在类中,默认状况下全部成员都是私有的,而在结构中默认状况下全部成员都是公共的。 设计
对于结构,没有像构造函数和析构函数这样的术语,可是对于类编译器,若是不提供,则会建立默认值。 指针
空类的Sizeof结构为0字节,而空类的Sizeof为1字节结构的默认访问类型为public。 一般应将结构用于分组数据。 code
类的默认访问类型为private,继承的默认模式为private。 应该使用一个类对数据和对该数据进行操做的方法进行分组。 对象
简而言之,约定是在将数据分组时使用struct,而在咱们须要数据抽象甚至继承的状况下使用类。 继承
在C ++中,除非明确取消引用,不然结构和类将按值传递。 在其余语言中,类和结构可能具备不一样的语义-即。 对象(类的实例)能够经过引用传递,而结构能够经过值传递。 注意:有与此问题相关的评论。 请参阅讨论页添加到对话。
C ++中struct和class关键字之间的区别在于,当在特定的复合数据类型上没有特定的说明符时,默认状况下struct或union是仅考虑数据隐藏的public关键字,而class是考虑程序隐藏的private关键字。代码或数据。 老是有些程序员为了代码而使用struct来存储数据和使用类 。 有关更多信息,请联系其余来源。
从全部这些因素中,能够得出结论,概念类很是适合表示现实世界的对象,而不是“结构”。很大程度上,由于类中使用的OOP概念在解释现实世界场景时很是实用,所以更容易将它们合并为现实。例如,默认继承是结构的公共属性,可是若是将此规则应用于现实世界,这是很荒谬的。可是在类中,默认继承是private,这是更现实的作法。
不管如何,我须要证实的是,类是一个更普遍的,在现实世界中适用的概念,而结构是一个内部组织较差的原始概念(Eventhough结构遵循OOP概念,它们的含义不好)。
类是引用类型,结构是值类型。
当我说类是引用类型时,
基本上,它们将包含实例变量的地址。
例如:
Class MyClass { Public Int DataMember; //By default, accessibility of class data members //will be private. So I am making it as Public which //can be accessed outside of the class. }
在主要方法中
我可使用为该类分配内存的新运算符建立该类的实例
并将其基地址存储到MyClass类型变量(_myClassObject2)中。
Static Public void Main (string[] arg) { MyClass _myClassObject1 = new MyClass(); _myClassObject1.DataMember = 10; MyClass _myClassObject2 = _myClassObject1; _myClassObject2.DataMember=20; }
在上面的程序中,MyClass _myClassObject2 = _myClassObject1; 指令指示两个MyClass类型的变量
并将指向相同的内存位置。
它基本上将相同的内存位置分配给另外一个相同类型的变量。
所以,若是咱们对MyClass类型的任何一个对象进行的任何更改都会对另外一个对象产生影响
由于二者都指向相同的存储位置。
“ _myClassObject1.DataMember = 10;” 在此行,对象的两个数据成员都将包含值10。
“ _myClassObject2.DataMember = 20;” 在此行,对象的数据成员都将包含值20。
最终, 咱们经过指针访问对象的数据成员。
与类不一样,结构是值类型。 例如:
Structure MyStructure { Public Int DataMember; //By default, accessibility of Structure data //members will be private. So I am making it as //Public which can be accessed out side of the structure. } Static Public void Main (string[] arg) { MyStructure _myStructObject1 = new MyStructure(); _myStructObject1.DataMember = 10; MyStructure _myStructObject2 = _myStructObject1; _myStructObject2.DataMember = 20; }
在上面的程序中
使用new运算符实例化MyStructure类型的对象
将地址存储到MyStructure类型的_myStructObject变量中,并
使用“ _myStructObject1.DataMember = 10”将值10分配给结构的数据成员。
在下一行中
我声明了另外一个MyStructure类型的变量_myStructObject2,并将_myStructObject1分配给它。
.NET C#编译器在这里建立_myStructureObject1对象的另外一个副本,并
将该内存位置分配给MyStructure变量_myStructObject2。
所以,不管咱们对_myStructObject1进行的更改如何,都永远不会对MyStructrue类型的另外一个变量_myStructObject2产生影响。
这就是为何咱们说结构是值类型。
所以,该类的直接基类是Object,而Structure的直接基类是ValueType,它从Object继承。
类将支持继承,而结构则不支持。
咱们怎么说呢?
那是什么缘由呢?
答案是班级。
它能够是抽象的,密封的,静态的和部分的,而且不能是私有的,受保护的和受保护的内部。