这个问题已经在c# /. net上下文中提出过了。
现在我想学习c++中结构体和类的区别。请讨论在OO设计中选择一种或另一种的技术差异以及原因。
我将从一个明显的区别开始:
如果没有指定public:或private:,结构体的成员默认为public;默认情况下,类的成员是私有的。
我敢肯定,在c++规范的晦涩角落里还会发现其他不同之处。
这个问题已经在c# /. net上下文中提出过了。
现在我想学习c++中结构体和类的区别。请讨论在OO设计中选择一种或另一种的技术差异以及原因。
我将从一个明显的区别开始:
如果没有指定public:或private:,结构体的成员默认为public;默认情况下,类的成员是私有的。
我敢肯定,在c++规范的晦涩角落里还会发现其他不同之处。
当前回答
. In classes all the members by default are private but in structure members are public by default. There is no term like constructor and destructor for structs, but for class compiler creates default if you don't provide. Sizeof empty structure is 0 Bytes wer as Sizeof empty class is 1 Byte The struct default access type is public. A struct should typically be used for grouping data. The class default access type is private, and the default mode for inheritance is private. A class should be used for grouping data and methods that operate on that data. In short, the convention is to use struct when the purpose is to group data, and use classes when we require data abstraction and, perhaps inheritance. In C++ structures and classes are passed by value, unless explicitly de-referenced. In other languages classes and structures may have distinct semantics - ie. objects (instances of classes) may be passed by reference and structures may be passed by value. Note: There are comments associated with this question. See the discussion page to add to the conversation.
其他回答
规范里没有,没有。主要的区别在于程序员在2年内阅读你的代码时的期望。结构体通常被假定为POD。当您为定义对象以外的目的定义类型时,也会在模板元编程中使用结构。
类的成员默认为private。Struct的成员默认为public。除此之外,没有其他区别。还有这个问题。
类只有在软件工程上下文中才有意义。在数据结构和算法的上下文中,类和结构并没有那么大的不同。没有任何规则限制必须引用类的成员。
当与大量的人一起开发大型项目时,你可能最终会得到复杂的耦合代码,因为每个人都使用他们想要的函数和数据。类提供权限控制和固有属性,以增强代码的解耦和重用。
如果您阅读了一些软件工程原理,就会发现没有类,大多数标准都无法轻松实现。例如: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29
顺便说一句,当一个struct分配了大量内存并包含了几个变量时,值类型变量表示值嵌入到struct分配的位置。相比之下,引用类型变量的值是外部的,由一个指针引用,该指针也嵌入在struct分配的地方。
类是引用类型,结构是值类型。 我说类是引用类型, 基本上,它们将包含实例变量的地址。
例如:
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。 类将支持继承,而结构则不支持。
我们怎么能这么说呢? 这背后的原因是什么? 答案是类。
它可以是抽象的、密封的、静态的和局部的,不能是私有的、受保护的和内部的。
另一个主要区别是模板。据我所知,你可以在定义模板时使用类,但不能定义结构。
template<class T> // OK
template<struct T> // ERROR, struct not allowed here