这个问题已经在c# /. net上下文中提出过了。
现在我想学习c++中结构体和类的区别。请讨论在OO设计中选择一种或另一种的技术差异以及原因。
我将从一个明显的区别开始:
如果没有指定public:或private:,结构体的成员默认为public;默认情况下,类的成员是私有的。
我敢肯定,在c++规范的晦涩角落里还会发现其他不同之处。
这个问题已经在c# /. net上下文中提出过了。
现在我想学习c++中结构体和类的区别。请讨论在OO设计中选择一种或另一种的技术差异以及原因。
我将从一个明显的区别开始:
如果没有指定public:或private:,结构体的成员默认为public;默认情况下,类的成员是私有的。
我敢肯定,在c++规范的晦涩角落里还会发现其他不同之处。
当前回答
类是引用类型,结构是值类型。 我说类是引用类型, 基本上,它们将包含实例变量的地址。
例如:
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.
}
在主要方法中, 我可以使用new操作符创建该类的实例,为该类分配内存 并将其基址存储到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。在这一行,对象的两个数据成员都包含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 "将值10赋给结构的数据成员。DataMember = 10”。
下一行, 我声明了另一个MyStructure类型的变量_myStructObject2,并将_myStructObject1赋值给它。 这里。net c#编译器创建了_myStructureObject1对象的另一个副本 将该内存位置分配给MyStructure变量_myStructObject2。
因此,无论我们对_myStructObject1做了什么改变,都不会对另一个MyStructrue类型的变量_myStructObject2产生影响。 这就是为什么我们说结构是值类型。
class的直接基类是Object而Structure的直接基类是继承自Object的ValueType。 类将支持继承,而结构则不支持。
我们怎么能这么说呢? 这背后的原因是什么? 答案是类。
它可以是抽象的、密封的、静态的和局部的,不能是私有的、受保护的和内部的。
其他回答
规范里没有,没有。主要的区别在于程序员在2年内阅读你的代码时的期望。结构体通常被假定为POD。当您为定义对象以外的目的定义类型时,也会在模板元编程中使用结构。
唯一的其他区别是类和结构的默认继承,不出意外,它们分别是私有和公共的。
您可以将此作为何时使用struct或class的指导方针,https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx。
的实例,考虑定义一个结构体而不是类 类型小,通常寿命短或通常嵌入 其他对象。 避免定义结构体,除非该类型具有所有的 以下特点: 它在逻辑上代表一个值, 类似于基本类型(int, double等)。 它有一个实例 大小小于16字节。 它是不可变的。 它不必被装箱 频繁。
引用c++ FAQ,
[7.8] What's the difference between the keywords struct and class? The members and base classes of a struct are public by default, while in class, they default to private. Note: you should make your base classes explicitly public, private, or protected, rather than relying on the defaults. Struct and class are otherwise functionally equivalent. OK, enough of that squeaky clean techno talk. Emotionally, most developers make a strong distinction between a class and a struct. A struct simply feels like an open pile of bits with very little in the way of encapsulation or functionality. A class feels like a living and responsible member of society with intelligent services, a strong encapsulation barrier, and a well defined interface. Since that's the connotation most people already have, you should probably use the struct keyword if you have a class that has very few methods and has public data (such things do exist in well designed systems!), but otherwise you should probably use the class keyword.
我发现了另一个不同。如果在类中没有定义构造函数,编译器将定义一个。但是在struct中,如果你没有定义构造函数,编译器也不会定义构造函数。因此,在某些情况下,我们确实不需要构造函数,struct是一个更好的选择(性能技巧)。 对不起,我的英语不好。