赞
踩
现在,我想学习C ++中的结构和类之间的区别。 请讨论技术差异以及在OO设计中选择一个或另一个的原因。
我将从一个明显的区别开始:
如果您未指定public:或private: :,则结构的成员默认为public; 默认情况下,类的成员是私有的。
我确信在C ++规范的晦涩之处可以找到其他差异。
#1楼
默认情况下,结构的成员是公共的,而默认情况下,类的成员是私有的。
从另一个结构或类的结构的默认继承是公共的。从另一个结构或类的结构的默认继承是私有的。
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上。
#2楼
。 在类中,默认情况下所有成员都是私有的,而在结构中默认情况下所有成员都是公共的。
对于结构,没有像构造函数和析构函数这样的术语,但是对于类编译器,如果不提供,则会创建默认值。
空类的Sizeof结构为0字节,而空类的Sizeof为1字节结构的默认访问类型为public。 通常应将结构用于分组数据。
类的默认访问类型为private,继承的默认模式为private。 应该使用一个类对数据和对该数据进行操作的方法进行分组。
简而言之,约定是在将数据分组时使用struct,而在我们需要数据抽象甚至继承的情况下使用类。
在C ++中,除非明确取消引用,否则结构和类将按值传递。 在其他语言中,类和结构可能具有不同的语义-即。 对象(类的实例)可以通过引用传递,而结构可以通过值传递。 注意:有与此问题相关的评论。 请参阅讨论页添加到对话。
#3楼
C ++中struct和class关键字之间的区别在于,当在特定的复合数据类型上没有特定的说明符时,默认情况下struct或union是仅考虑数据隐藏的public关键字,而class是考虑程序隐藏的private关键字。代码或数据。 总是有些程序员为了代码而使用struct来存储数据和使用类 。 有关更多信息,请联系其他来源。
#4楼
从所有这些因素中,可以得出结论,概念类非常适合表示现实世界的对象,而不是“结构”。很大程度上,因为类中使用的OOP概念在解释现实世界场景时非常实用,因此更容易将它们合并为现实。例如,默认继承是结构的公共属性,但是如果将此规则应用于现实世界,这是很荒谬的。但是在类中,默认继承是private,这是更现实的做法。
无论如何,我需要证明的是,类是一个更广泛的,在现实世界中适用的概念,而结构是一个内部组织较差的原始概念(Eventhough结构遵循OOP概念,它们的含义很差)。
#5楼
类是引用类型,结构是值类型。
当我说类是引用类型时,
基本上,它们将包含实例变量的地址。
例如:
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类型的变量
myClassObject1
myClassObject2
并将指向相同的内存位置。
它基本上将相同的内存位置分配给另一个相同类型的变量。
因此,如果我们对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继承。
类将支持继承,而结构则不支持。
我们怎么说呢?
那是什么原因呢?
答案是班级。
它可以是抽象的,密封的,静态的和部分的,并且不能是私有的,受保护的和受保护的内部。
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。