ChatGPT解决这个技术问题 Extra ChatGPT

++中的结构和类有什么区别?

这个问题是already asked in the context of C#/.Net

现在我想了解 C++ 中结构和类之间的区别。请讨论技术差异以及在 OO 设计中选择其中一种的原因。

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

如果不指定 public: 或 private:,则结构的成员默认是公共的;默认情况下,类的成员是私有的。

我确信在 C++ 规范的晦涩角落中还可以找到其他差异。

这个link很好地总结了这些差异。
那为什么大家都用struct来建树呢?因为看起来差别并没有那么大。顺便说一句,That 是一个很棒的网站。@sjsam
寻找 C 和 C++ 中 struct 之间的区别? See here
@JW.ZG 不是“所有人”都这样做!这样做的人要么只是喜欢,要么没有意识到 struct 在 C++ 中的含义。 ;) 但是您没有理由不能使用 class 关键字。

C
Cheers and hth. - Alf

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

引用标准(C++98 到 C++11 中的第 11.2.2 节):

如果基类没有访问说明符,则在派生类声明为 struct 时假定为 public,而在声明类时假定为 private。

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

默认情况下,使用关键字 class 定义的类的成员是私有的。默认情况下,使用关键字 struct 或 union 定义的类的成员是公共的。

附加区别:关键字 class 可以用于声明模板参数,而关键字 struct 不能这样使用。


这并不是真正的第二个差异,只是问题不完整地说明了差异。所有子对象在使用 class 时默认为私有,在 struct 时默认为公共,并且都定义了一个类类型。
我想你没抓住重点,本。它是结构的公共继承和类的私有继承。这是一个非常重要的区别,与实际的成员访问完全无关。例如,语言可以很好地定义它,例如默认情况下两者都是公开继承的,你会得到非常不同的含义。
实际上,structclass 之间真正棘手的区别在于后者可以用来代替 typename 来声明模板参数,而前者不能。 :)
@MrUniverse:这是完全错误的。 (有一所学校将其用于约定,但在语法上并未强制执行。)
@sbi“结构和类之间真正棘手的区别”——很可爱,但问题是关于结构和类之间的区别,而不是关于可以使用关键字的位置的区别。
d
dgellow

引用 The C++ FAQ

[7.8]关键字struct和class有什么区别?结构的成员和基类默认是公共的,而在类中,它们默认是私有的。注意:您应该明确地使您的基类公开、私有或受保护,而不是依赖默认值。结构和类在其他方面在功能上是等价的。好的,足够干净的技术谈话了。从情感上讲,大多数开发人员在类和结构之间做出了强烈的区分。结构感觉就像是一堆开放的位,封装或功能的方式很少。一个类感觉就像是一个活生生的、负责任的社会成员,具有智能服务、强大的封装屏障和定义明确的接口。由于这是大多数人已经拥有的含义,因此如果您的类具有很少的方法并且具有公共数据(这样的东西确实存在于设计良好的系统中!),您可能应该使用 struct 关键字,否则您可能应该使用该类关键词。


J
Jon Hanna

值得记住 C++ 的起源以及与 C 的兼容性。

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

在采用面向对象的方法时,默认情况下公开通常被认为是一个坏主意,因此在制作一种原生有利于 OOP 的 C 形式时(您可以在 C 中执行 OO,但它对您没有帮助),这是C++ 中的想法(最初是“C With Classes”),默认情况下将成员设为私有是有意义的。

另一方面,如果 Stroustrup 改变了 struct 的语义,使其成员默认是私有的,它就会破坏兼容性(它不再像标准分歧那样经常如此,但所有有效的 C 程序也是有效的C++ 程序,这对让 C++ 站稳脚跟有很大的影响)。

因此,引入了一个新关键字 class,使其与结构完全相同,但默认情况下是私有的。

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

一般来说,人们在做类似 C 中如何使用结构的事情时会倾向于使用结构。公共成员,没有构造函数(只要它不在联合中,你可以在结构中拥有构造函数,就像类一样,但人们倾向于不这样做),没有虚拟方法等。因为语言与语言一样多人们阅读代码以指示机器(否则我们会坚持使用汇编和原始 VM 操作码),坚持下去是个好主意。


可能还值得注意的是,让类和结构在底层工作相同可能比让它们根本不同更容易。回想起来可能有一些好处,例如指定声明为结构的任何东西都必须是 PODS(即禁止结构具有虚拟成员、重要的默认构造函数或析构函数等),但据我所知,这样的事情并不任何 C++ 标准或实现都曾要求过。
@supercat 事实上,它是一种 OO 语言,其中用非 OO 语言编写的大量程序都是有效程序,将这个概念带到了前台,而且它似乎比纯粹的 OO 语言更多地出现(当然实际上是在标准中定义的)。早期 C++ 的历史肯定解释了很多。 Stroustrup 的“The Design and Evolution of C++”是一本有趣的读物。
我认为人们之间的宗教战争认为一切不是“oop-ish”,都应该是,而那些认为 OOP 应该被视为一种工具,而不是工具的人。 C++ 似乎当然接受后一种哲学,但我对它之前的语言真的不太了解。我自己的哲学是,当一个人想要一个对象时,应该使用一个对象,而当一个人想要一个相关但独立的变量的聚合时,应该使用它。 C++ 在这些东西之间没有语法上的区别,.NET 试图模糊这种区别,但我对 D 知之甚少......
...表明它比 C++ 或 .NET 更能识别它。变量的聚合并不完全是 OOPish,但这并不意味着当它们有用时不应该使用它们。
我不同意“C 有结构,它没有封装的概念,所以一切都是公开的。”,您可以在 *.c-File 中隐藏 struct 的定义,并让其他翻译单元仅通过指针使用它.所以你有一个更强大的封装,因为其他翻译单元甚至不知道 struct 里面是什么。
C
Community

类的成员默认是私有的。结构的成员默认是公开的。除此之外没有其他区别。另见this question


不仅是成员,还有所有访问权限,包括继承。
好吧,我想说另一个区别是语义。对许多人来说,Struct 让他们认为“数据结构”是 C 语言的遗留物。
@KrisKumler:那些不是“语义”;它们是个人感受。 structclass 都声明了一个具有相同语义的 class(尽管对定义主体进行了解析解释)。
c
crashmstr

根据 C++ Programming Language 中的 Stroustrup:

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

功能上,除了public/private没有区别


有什么区别?请解释。
d
dgellow

类的成员默认是私有的,结构的成员默认是公有的。

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

// Program 1
#include <stdio.h>
 
class Test {
    int x; // x is private
};

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

int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

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

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

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

我已经删除了专家提到的代码示例 3-7
6
64BitBob

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

类是一种不同类型的抽象数据类型,它试图确保信息隐藏。在内部,可以有各种机制、方法、临时变量、状态变量。等等,它们都用于为希望使用该类的任何代码提供一致的 API。

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

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

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


这是关于结构和类的最不明显的事情。 “结构与数据有关,类与代码有关”可以改写为“结构与数据有关,类与数据有关,安全性和对这些数据执行的操作”
无法在 C++ 中创建结构。只能使用继承的 struct 关键字创建类。
这个答案似乎与 C++ 无关。在 C++ 中,struct 声明类(包括 public/private/protected、继承等)。
结构是如何抽象的?即使在 C 中,将原始结构写入文件也充满了问题(常见的问题包括填充、字节顺序、不同的字长等)。你说的这个 SIZE 宏是什么?
T
Tim Cooper

唯一的另一个区别是类和结构的默认继承,不出所料,它们分别是私有的和公共的。


4
463035818_is_not_a_number

classstruct 之间的区别是关键字之间的区别,而不是数据类型之间的区别。这两个

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

两者都定义了一个类类型。此上下文中关键字的不同之处在于默认访问权限不同:

foo::x 是公开的,而 foo_base 是公开继承的

bar::x 是私有的并且 bar_base 是私有继承的


m
melpomene

结构的成员默认是公共的,类的成员默认是私有的。 Structure 从另一个结构或类的默认继承是公共的。从另一个结构或类的类的默认继承是私有的。

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上。


_tmain 不是标准 C++。
M
MSalters

不在规范中,没有。主要区别在于程序员在 2 年内阅读您的代码时的期望。结构通常被假定为 POD。当您为定义对象以外的目的定义类型时,结构也用于模板元编程。


K
KPexEA

需要注意的另一件事是,如果您更新了具有使用类的结构的旧版应用程序,您可能会遇到以下问题:

旧代码有结构,代码被清理,这些变成了类。然后将一两个虚函数添加到新更新的类中。

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

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


使用 memfill 清除结构的代码可能还有其他令人反感的习惯。谨慎行事。
@DavidThornley:使用零填充来擦除或初始化数据结构是 C 中的标准。在混合语言项目中,不能指望 C 部分中的代码避免 calloc 而支持 new。唯一能做的就是尽量确保代码的 C 部分使用的任何结构实际上都是 PODS。
S
Stefan Popescu

另一个主要区别是在模板方面。据我所知,您可以在定义模板而不是结构时使用类。

template<class T> // OK
template<struct T> // ERROR, struct not allowed here

如果您打算强调结构不能用作通用类型,那么您就错了。并且 struct 只是按照惯例是不允许的(最好是 class 关键字在此处以不同的含义使用,请参阅 Use 'class' or 'typename' for template parameters)。
那里不允许使用关键字,但您可以传入使用 struct 定义的类就可以了。简单地尝试一下。 struct T{}; template <typename T> void foo() {} foo<T>();
B
Bathsheba

默认情况下,使用关键字 class 定义的类的成员是私有的。默认情况下,使用关键字 struct(或 union)定义的类的成员是公共的。如果基类没有访问说明符,则在派生类声明为 struct 时假定为 public,而在声明类时假定为 private。您可以声明枚举类,但不能声明枚举结构。您可以使用模板,但不能使用模板

另请注意,C++ 标准允许您将类型前向声明为 struct,然后在声明类型时使用 class,反之亦然。此外,对于 Y 是 structclassstd::is_class<Y>::valuetrue,但对于 enum classfalse


很好的答案,虽然我错过了一个明确无误的 0)C++ 中 structclass 之间的区别是关键字之间的区别,而不是数据类型之间的区别(或一些更好的选择;)
@以前已知的_463035818:但你不认为std::is_class<Y>::value涵盖了这一点吗?
是的,只是认为它可能会更突出,因为那是常见的误解,一旦排除,其余的只是推论。
没关系,你的答案是完美的,我写了另一个,再写一个也没坏处
n
nutario

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

因此,再一次:在 C++ 中,结构与类相同,只是结构的成员默认具有公共可见性,但类的成员默认具有私有可见性。


f
finnw

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


G
Gregory Pakosz

ISO IEC 14882-2003 9 类§3 结构是用类键结构定义的类;它的成员和基类(第 10 条)默认是公共的(第 11 条)。


y
ymett

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

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


我知道这是一个很晚的评论,但请注意,上述警告并非没有优点,因为 Windows ABI 以不同方式破坏结构和类,因此混合(前向)类和结构声明实际上会导致难以理解的链接问题!
y
yshivakathik

.在类中,默认情况下所有成员都是私有的,但在结构中,默认情况下成员是公共的。结构没有构造函数和析构函数之类的术语,但是如果您不提供,则类编译器会创建默认值。 Sizeof 空结构是 0 Bytes 或者 Sizeof 空类是 1 Byte 结构默认访问类型是 public。通常应该使用结构来对数据进行分组。类默认访问类型是私有的,继承的默认模式是私有的。应该使用一个类来对数据和对该数据进行操作的方法进行分组。简而言之,约定是当目的是对数据进行分组时使用结构,而当我们需要数据抽象和可能继承时使用类。在 C++ 中,结构和类是按值传递的,除非显式取消引用。在其他语言中,类和结构可能具有不同的语义——即。对象(类的实例)可以通过引用传递,结构可以通过值传递。注意:有与此问题相关的评论。请参阅讨论页添加到对话。

结构没有构造函数和析构函数之类的术语,但是如果您不提供,则类编译器会创建默认值。

Sizeof 空结构是 0 Bytes 或者 Sizeof 空类是 1 Byte 结构默认访问类型是 public。通常应该使用结构来对数据进行分组。


“2. 空结构的大小为 0 字节,因为空类的大小为 1 字节”。错误的。我刚刚用 g++ 进行了测试。您可能正在考虑空基优化,但这也适用于两者。
不对。在 C++ 中,空结构的大小为 1。在 C 中,不允许使用空结构。 GCC 允许 C 中的空结构作为编译器扩展,并且这样的结构的大小为 0。
这个答案是错误的。除了大小之外,构造函数/析构函数部分也不准确:结构可以有构造函数和析构函数就好了。事实上,struct 在 C++ 中创建了成熟的类。
U
UKMonkey

虽然其他答案暗示了这一点,但并未明确提及 - 结构与 C 兼容,具体取决于使用情况;类不是。

这意味着如果您正在编写一个希望与 C 兼容的标头,那么除了 struct (在 C 世界中不能有函数;但可以有函数指针)之外,您别无选择。


M
Maciej Urbański

还有一个不成文的规则告诉我们:如果类的数据成员与自己没有关联,则使用结构。如果数据成员的值依赖于数据成员的另一个值,则使用类。

class Time
{
    int minutes;
    int seconds;
}

struct Sizes
{
    int length;
    int width;
};

C
Community

您可以将其作为关于何时使用 struct 或 class https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx 的指南。

√ 如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。 X 避免定义结构,除非该类型具有以下所有特征: 它在逻辑上表示单个值,类似于原始类型(int、double 等)。它的实例大小小于 16 个字节。它是不可变的。它不必经常装箱。


那是关于 .NET/C#,而不是 C++。
s
snow

类仅在软件工程的上下文中才有意义。在数据结构和算法的上下文中,类和结构没有那么不同。没有任何规则限制必须引用该类的成员。

当开发有大量没有课程的人的大型项目时,您最终可能会得到复杂的耦合代码,因为每个人都使用他们想要的任何函数和数据。类提供权限控制和固有功能以增强解耦和重用代码。

如果您阅读了一些软件工程原理,您会发现大多数标准如果不上课就无法轻松实现。例如:http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

顺便说一句,当结构分配大量内存并包含多个变量时,值类型变量表示值嵌入在分配结构的位置。相反,引用类型变量的值是外部的,并且由一个指针引用,该指针也嵌入在分配结构的位置。


这个答案似乎与 C++ 无关。在 C++ 中,struct 声明类(包括权限控制、继承等)。
M
MOBITI MAHENGE

C++中struct和class关键字的区别在于,当特定复合数据类型没有特定说明符时,默认struct或union是public关键字,只考虑数据隐藏,class是private关键字,考虑隐藏程序代码或数据。总是有些程序员为了代码而使用结构来存储数据和类。有关更多信息,请联系其他来源。


OP 已经提到 struct 成员默认情况下是公共的,并且 2009 年接受的答案提到了继承。为什么要写另一个 4 年后没有添加新信息的答案?
W
Wageesha

在所有这些因素中,可以得出结论,概念类非常适合表示现实世界的对象,而不是“结构”。很大程度上是因为类中使用的 OOP 概念在解释现实世界场景时非常实用,因此更容易将它们与现实结合起来。例如,结构的默认继承是公共的,但如果我们将此规则应用于现实世界,那就太荒谬了。但是在一个类中,默认继承是私有的,这更现实。

无论如何,我需要证明的是,类是一个更广泛的、现实世界适用的概念,而结构是一个内部组织很差的原始概念(尽管结构遵循 OOP 概念,但它们的含义很差)


私有继承如何“更现实”?大多数编程语言甚至没有私有继承的概念。
T
Tushar Bobade

oops 中结构体和类关键字的主要区别在于,结构体中不存在公共和私有成员声明。数据成员和成员函数可以定义为公共、私有和受保护的。


这个答案似乎与 C++ 无关。在 C++ 中,struct 声明类(包括 public/private/protected、继承等)。
Y
Yug Rawal

struct 和 class 的主要区别在于,struct 中只能声明不同数据类型的数据变量,而 class 中可以声明数据变量、成员函数,从而可以通过函数来操作数据变量。

-> 我在类 vs 结构中发现的另一件方便的事情是,在程序中实现文件时,如果你想在每组新操作上一次又一次地对结构进行一些操作,你需要创建一个单独的函数,你需要从文件中读取结构的对象后传递它,以便对其进行一些操作。在课堂上,如果您创建一个函数,该函数每次都对所需的数据进行一些操作..它很容易,您只需从文件中读取对象并调用该函数..

但这取决于程序员他/她认为哪种方式合适......根据我的说法,我每次都喜欢上课,因为它支持 OOP,这就是它在几乎所有语言中实现的原因以及它所有时间编程的美妙特性;- )

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


在 C++ 中 struct 可以有成员函数
@chtz 谢谢...我刚刚知道了这个功能..非常感谢..我只是一个初学者,不像你那么专家,所以将来也需要你们的建议:-)
实际上,成员函数的含义更广泛。 struct 可以有构造函数、成员函数和析构函数(可能是虚拟的、可能是私有的、受保护的或公共的)。他们可以继承和被继承。所以实际上......一个班级可以拥有的一切。一个典型的约定是用 struct 声明你在 C 中声明为 struct 的内容,如果我们声明私有和受保护变量、虚函数、ctor 和 dtor 等,则声明为类。但这只是一个约定,不是由语言强制执行的
A
Ali

我发现了另一个不同之处。如果您没有在类中定义构造函数,编译器将定义一个。但是在结构中,如果你没有定义构造函数,编译器也不会定义构造函数。所以在某些我们真的不需要构造函数的情况下,struct 是更好的选择(性能提示)。对不起我的英语不好。


这不是真的。在这方面,用 struct 关键字定义的类和用 class 关键字定义的类没有区别。
当我使用没有构造函数的结构时,我得到的速度比没有构造函数的类要快。
@Ali 不,你没有。
F
Frank Myat Thu

类是引用类型,结构是值类型。当我说类是引用类型时,基本上它们将包含实例变量的地址。

例如:

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.
}

在 main 方法中,我可以使用 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 类型的两个变量

我的类对象 1 我的类对象 2

并将指向相同的内存位置。它基本上将相同的内存位置分配给另一个相同类型的变量。

因此,如果我们对任何一个对象类型 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 所做的任何更改都不会对另一个 MyStructObject 类型的变量 _myStructObject2 产生影响。这就是为什么我们说结构是值类型。

所以类的直接基类是对象,结构的直接基类是继承自 Object 的 ValueType。类将支持继承,而结构则不支持。

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

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


我认为这是试图回答 c# 的问题?问题是关于 c++ 的,这使得这个答案不准确,对吧?
@smw 绝对是,他用 C# 编写了他的示例代码,我来这里是为了检查 C++ structclass 之间的参数传递没有区别。这里没有人提到它,也没有整个网络。所以我认为这也不适用于 C++。
这甚至不是有效的 C# 代码——关键字都是错误的。 “Public”、“Static”、“Int”和“Class”不应该大写,应该是“struct”而不是“Structure”。描述对于 C# 来说是最准确的(尽管结构仍然可以继承接口,只是不能继承其他结构),但由于它是关于 C++ 的,所以没有回答这个问题......
这个答案完全是胡说八道。它的代码示例使用了 Visual Basic 和 C# 的奇怪组合,整个“类是引用类型,结构是值类型”......事情只适用于 .NET(即 C#)而不适用于 C++。你进错房间了,伙计。这是您所属的地方:stackoverflow.com/questions/13049
但是 this answer 表示同样适用于 C(++),即结构体的使用与值类型类似。 int a = 3; int b = a; 和类似的 MyStruct a=MyStruct("data"); MyStruct b = a;
N
Naveen

结构和类之间有3个基本区别

1St-内存是为堆栈内存中的结构保留的(接近编程语言),堆栈内存中的类是否保留仅用于引用和实际内存保留在堆内存中。

2Nd - 默认情况下,结构视为公共,无论类视为私有。

3Rd-不能在结构中重用代码,但在类中我们可以多次重用相同的代码,称为inhertence


C++ 结构确实支持继承和抽象方法。结构和类的分配方式相同。即使没有用“新”实例化它们,在堆上分配类对嵌入式系统也没有意义。
#1 也是错误的。当您将该类型的某些东西声明为局部变量时使用堆栈,而当您使用“new”运算符时使用堆。