C ++中的struct和class有什么区别?

这个问题已经在C#/ .Net的上下文中提出过了 。

现在我想了解C ++中的结构和类之间的区别。 请讨论技术差异以及在OOdevise中select其中一个的原因。

我将从一个明显的区别开始:

  • 如果您不指定public:private: :,则默认情况下,结构的成员是公共的; 一个class级的成员默认是私人的。

我相信在C ++规范的不起眼的angular落还有其他的不同之处。

你忘记了类和结构之间棘手的第二个区别。

定义标准(C ++ 98到C ++ 11中的第11.2.2节):

在没有基类的访问说明符的情况下,在派生类被声明的时候假定public。当类被声明为class时 ,假定为struct和private。

为了完整起见,在(11.2)中定义了类和结构之间广为人知的区别:

使用关键字class定义的类的成员默认是私有的。 用关键字structunion定义的类的成员默认是公共的。

其他区别:关键字class可用于声明模板参数,而struct关键字不能如此使用。

引用C ++ FAQ ,

[7.8]关键字struct和class有什么区别?

结构的成员和基类是默认公开的,而在类中,它们默认是私有的。 注意:您应该使您的基类明确公开,私有或受保护,而不是依靠默认值。

结构和类在function上是等价的。

好吧,足够的那个尖锐的清洁技术讲座。 在情感方面,大多数开发人员在类和结构之间进行了强烈的区分。 结构只是感觉像一堆开放的东西,封装或function很less。 一个class级感觉自己像一个活跃和负责任的社会成员,拥有智能化的服务,强大的封装屏障,以及明确的界面。 由于这是大多数人已经拥有的内涵,所以如果你有一个只有很less方法和公共数据的类(这些东西确实存在于devise良好的系统中),你应该使用struct关键字,否则你应该使用类关键词。

值得回忆一下C ++的起源和兼容性。

C有结构,没有封装的概念,所以一切都是公开的。

当采用面向对象的方法时,默认是公开的,通常被认为是一个坏主意,所以在做一个本质上有利于面向对象的C的forms(你可以在C中做OO,但它不会帮你)在C ++中的想法(原来是“C With Classes”),默认情况下使成员保持私有是有意义的。

另一方面,如果Stroustrup已经改变了struct的语义,以使得它的成员默认是私有的,那么就会破坏兼容性(不再像标准分歧一样,但是所有有效的C程序都是有效的C ++程序,这对C ++的立足点有很大的影响)。

所以引入了一个新的关键字class ,就像一个结构,但是默认情况下是私有的。

如果C ++从头开始,没有历史,那么它可能只有一个这样的关键字。 它也可能不会产生它所造成的影响。

一般来说,当他们正在做类似C中结构体的操作时,人们会倾向于使用struct; 公共成员,没有构造函数(只要它不在一个联合体中, 就可以像构build类似的类,但人们往往不会),没有虚拟方法等等。因为语言和人们阅读代码来指导机器(否则我们会坚持使用汇编和原始VM操作码),坚持这一点是一个好主意。

类“成员默认是私有的。 Struct的成员默认是公共的。 除此之外,没有其他的区别。 也看到这个问题 。

根据Stroustrup的C ++编程语言 :

你使用哪种风格取决于环境和口味。 我通常更喜欢使用struct的公开所有数据的类。 我认为这样的类“不太合适的types,只是数据结构”。

在function上,除了公共/私人之外没有任何区别

STRUCT是一种抽象数据types,根据结构规范划分给定的内存块。 结构在文件序列化/反序列化中特别有用,因为结构通常可以逐字写入文件。 (即获取指向结构的指针,使用SIZEmacros来计算要复制的字节数,然后将数据移入或移出结构。)

类是一种不同types的抽象数据types,试图确保信息隐藏。 在内部,可以有多种机制,方法,临时variables,状态variables。 等等,这些都是用来给任何希望使用该类的代码提供一致的API。

实际上,结构是关于数据的,类是关于代码的。

但是,您需要了解这些仅仅是抽象。 创build看起来很像类和类的结构是非常可能的,这些结构看起来很像结构。 事实上,最早的C ++编译器仅仅是将C ++代码转换为C的预编译器。因此,这些抽象是逻辑思维的好处,而不一定是计算机本身的资产。

除了每种都是不同的抽象types之外,类为C代码命名难题提供了解决scheme。 由于您不能有多个使用相同名称公开的函数,因此开发人员使用_()的模式。 例如mathlibextreme_max()。 通过将API分组到类中,类似的function(在这里我们称之为“方法”)可以组合在一起,并且可以防止其他类中的方法命名。 这允许程序员更好地组织他的代码并增加代码重用。 理论上,至less。

唯一的区别是类和结构的默认inheritance,这并不令人惊讶,分别是私有的和公共的。

1)一个类的成员默认是私有的,struct的成员默认是公共的。

例如,程序1编译失败,程序2正常工作。

 // Program 1 #include <stdio.h> class Test { int x; // x is private }; int main() { Test t; tx = 20; // compiler error because x is private getchar(); return 0; } Run on IDE // Program 2 #include <stdio.h> struct Test { int x; // x is public }; int main() { Test t; tx = 20; // works fine because x is public getchar(); return 0; } 

2)从类/结构派生结构时,基类/结构的默认访问说明符是公共的。 当派生类时,默认访问说明符是私有的。

例如程序3编译失败,程序4正常工作。

 // Program 3 #include <stdio.h> class Base { public: int x; }; class Derived : Base { }; // is equilalent to class Derived : private Base {} int main() { Derived d; dx = 20; // compiler error becuase inheritance is private getchar(); return 0; } Run on IDE // Program 4 #include <stdio.h> class Base { public: int x; }; struct Derived : Base { }; // is equilalent to struct Derived : public Base {} int main() { Derived d; dx = 20; // works fine becuase inheritance is public getchar(); return 0; } 

不是在规范中,没有。 主要区别在于程序员在两年内读取代码的期望。 结构通常被认为是POD。 当定义types的目的不是定义对象时,结构也用于模板元编程。

还有一点需要注意的是,如果您更新了一个结构上使用类的遗留应用程序,则可能会遇到以下问题:

旧的代码有结构,代码被清理,这些代码被更改为类。 然后将一个或两个虚拟函数添加到新的更新类。

当虚函数在类中时,编译器会在内部添加指向类函数的额外指针以指向函数。

这将如何破坏旧的遗留代码是,如果在旧的代码结构被清除使用memfill将其全部清除为零,这也会跺脚额外的指针数据。

  1. 结构的成员默认是公共的,类的成员默认是私有的。
  2. 来自另一个结构或类的Structure的默认inheritance是public.Default从另一个结构或类inheritance类是私有的。
 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。

另一个主要的区别是当涉及到模板。 据我所知,当你定义一个模板而不是一个结构时,你可以使用一个类。

 template<class T> // OK template<struct T> // ERROR, struct not allowed here 
  • 。 在类中,默认情况下,所有成员都是私有的,但在结构成员中默认是公共的。

    1. 没有像结构体和结构体的析构函数这样的术语,但是对于类编译器来说,如果不提供,则会创build默认值。

    2. 空结构的Sizeof为0 Bytes,因为Sizeof为空的类为1 Byte结构默认访问types为public。 一个结构通常应该用于分组数据。

    类的默认访问types是私有的,默认的inheritance模式是私有的。 一个类应该用于分组数据和对这些数据进行操作的方法。

    简而言之,约定是为了分组数据而使用结构,而当我们需要数据抽象和可能的inheritance时使用类。

    在C ++中,结构和类是通过值传递的,除非明确地去引用。 在其他语言中,类和结构可能有不同的语义 – 即。 对象(类的实例)可以通过引用传递,并且结构可以按值传递。 注意:有与这个问题相关的评论。 请参阅讨论页添加到对话。

这是一个很好的解释: http : //carcino.gen.nz/tech/cpp/struct_vs_class.php

所以,再一次:在C ++中,一个结构与一个类是相同的,除了一个结构的成员在默认情况下具有公开可见性,但是一个类的成员默认情况下具有私有可见性。

这只是一个惯例。 可以创build结构来保存简单的数据,但后来随着成员函数和构造函数的增加而演变。 另一方面,看到除public之外的任何东西都是不寻常的:在一个结构中访问。

ISO IEC 14882-2003

9类

§3

结构是用class-key struct定义的 ; 其成员和基类(第10条)默认是公开的(第11条)。

其他的答案提到了私有/公共的默认,(但要注意的是,一个结构是一个类是一个结构;它们不是两个不同的项目,只是定义同一个项目的两种方式)。

有什么值得注意的(特别是因为提问者很可能使用MSVC ++,因为他提到“非托pipe”C ++)是,在某些情况下,如果一个类是用class声明的,然后用struct (或者可能是另一个class定义的,Visual C ++会抱怨方式),虽然标准说这是完全合法的。

虽然其他答案暗示,但没有明确提及 – 结构是C兼容的,这取决于使用情况; class级不是。

这意味着如果你正在编写一个你想要兼容C的头文件,那么除了struct(C世界中的这个函数不能有函数,但是可以有函数指针),你别无select。

C ++中structclass关键字的不同之处在于,当对特定的复合数据types没有特定的说明符时,默认情况下, structunion是仅考虑数据隐藏的public关键字,class是隐藏程序的private关键字代码或数据。 总是有一些程序员为了代码而使用struct和data。 欲了解更多信息联系其他来源。

从这些因素中可以得出结论,概念类非常适合代表真实世界的对象,而不是“结构”。大概是因为课堂上使用的面向对象的概念在解释真实世界的场景中是非常实用的,所以更容易将它们融合到现实中。举个例子,默认的inheritance是公共的结构,但是如果我们把这个规则应用到现实世界中,这是荒谬的。但是在一个类中,默认的inheritance是私有的,这是比较现实的。

无论如何,我需要certificate的是,类是一个更广泛的,真实的世界适用的概念,而结构是一个原始的概念与内部组织糟糕(Eventhough结构遵循面向对象的概念,他们有一个不好的意思)

类只在软件工程方面有意义。 在数据结构和algorithm的上下文中,类和结构没有什么不同。 没有任何规定限制该类的成员必须被引用。

在没有class级的情况下开发大型项目时,您最终可能会遇到复杂的代码,因为每个人都使用他们想要的任何函数和数据。 类提供权限控制和内联以增强解耦和重用代码。

如果你阅读一些软件工程原理,你会发现大多数标准不能轻易实现没有课堂。 例如: http : //en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

顺便说一句,当一个结构分配紧凑的内存并包含多个variables时,值typesvariables指示值被包含在分配struct的地方。 相比之下,引用typesvariables的值是外部的,并且通过也被embedded到结构被分配的地方的指针引用。

你可以考虑这个指导什么时候去结构或类, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx

√如果types的实例很小,通常是短暂的,或者通常embedded到其他对象中,则需要定义一个结构而不是类。

X AVOID定义一个结构,除非该types具有以下所有特征:

它在逻辑上表示一个单一的值,类似于原始types(int,double等)。

它有一个16字节以下的实例大小。

它是不可改变的。

它不会经常被装箱。

我发现了另一个区别。 如果你没有在一个类中定义一个构造函数,编译器将会定义一个构造函数。 但是在一个结构中,如果你没有定义一个构造函数,编译器也不会定义一个构造函数。 所以在某些情况下,我们确实不需要构造函数,struct是一个更好的select(性能提示)。 并为我的英语不好而感到抱歉。

oops中结构和类关键字的主要区别在于结构中没有公有和私有成员声明,​​数据成员和成员函数可以定义为public,private和protected。

我看到结构和类之间的另一个不同之处在于默认初始化。

 struct Foo { int a; }; class Bar { int a; }; class Tester { Foo m_Foo = Foo(); Bar m_Bar = Bar(); public: Tester() {} }; int main() { auto myTester = Tester(); } 

运行该代码并检查myTester。 你会发现对于m_Foo,struct m_Foo.a已经被初始化为0,但是对于m_Bar,类m_Bar.a是未初始化的。 所以在默认的构造函数为struct和class做什么似乎是有区别的。 我用Visual Studio看到了这个。

struct和class之间的主要区别是在struct中你只能声明不同数据types的数据variables,而在类中你可以声明数据variables,成员函数,因此你可以通过函数来​​操作数据variables。

– >另一个方便的事情,我在类和结构中find的是,当在一个程序中实现文件,如果你想一次又一次地做一个结构的一些操作,每一个新的一套操作,你需要做一个单独的function,你需要从文件中读取结构传递对象,以便对其进行一些操作。 而在课堂上,如果你做了一个函数,每次都需要对数据进行一些操作。很容易,你只需要从文件中读取对象并调用函数。

但它依赖于他/她认为合适的程序员……根据我的说法,我每次都喜欢上课,只是因为它支持OOP,这就是它几乎在所有语言中实现的原因,以及它所有时间编程的奇妙function; )

是啊,我忘了提到的最难忘的区别是,类支持数据隐藏,并且还支持在struct中不执行的内置数据types上执行的操作!

类是引用types,结构是值types。
当我说类是参考types时,
基本上他们会包含一个实例variables的地址。

例如:

 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运算符创build此类的一个实例
并将其基地址存储到MyClasstypesvariables(_myClassObject2)中。

 Static Public void Main (string[] arg) { MyClass _myClassObject1 = new MyClass(); _myClassObject1.DataMember = 10; MyClass _myClassObject2 = _myClassObject1; _myClassObject2.DataMember=20; } 

在上面的程序中,MyClass _myClassObject2 = _myClassObject1; 指令指示typesMyClass的两个variables

  1. myClassObject1
  2. myClassObject2

并将指向相同的内存位置。
它基本上分配相同的内存位置到另一个相同types的variables。

因此,如果我们在任何一个对象typesMyClass中做出的任何更改都会对另一个产生影响
因为两者都指向相同的内存位置。

“_myClassObject1.DataMember = 10;” 在这一行这两个对象的数据成员将包含值10。
“_myClassObject2.DataMember = 20;” 在这一行,对象的数据成员都将包含值20。
最终, 我们通过指针访问一个对象的数据成员。

与类不同,结构是值types。 例如:

 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运算符和实例化MyStructuretypes的对象
将地址存储到MyStructuretypes的_myStructObjectvariables中
使用“_myStructObject1.DataMember = 10”将值10分配给结构的数据成员。

在下一行中,
我声明另一个types为MyStructure的variables_myStructObject2,并将_myStructObject1赋值给它。
在这里.NET C#编译器创build_myStructureObject1对象的另一个副本
将该内存位置分配给MyStructurevariables_myStructObject2。

所以无论我们在_myStructObject1上做什么改变都不会影响MyStructruetypes的另一个variables_myStructObject2。
这就是为什么我们说结构是价值types。

因此,类的立即Base类是Object,而Structure的immediate Base类是从Objectinheritance的ValueType。
类将支持inheritance,而结构不会。

我们怎么说呢?
那背后的原因是什么?
答案是类。

它可以是抽象的,密封的,静态的和局部的,不能被私有,保护和保护内部。

There are 3 basic difference between structure and class

1St- memory are reserved for structure in stack memory (which is near to programming language )whether for class in stack memory are reserved for only reffrence and actual memory are reserved in heap memory.

2Nd – By default structure treat as a public whether class treat as a private .

3Rd- can't re -use code in structure but in class we can re-use same code in many time called inhertence