Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,为什么struct实际上是类?_C++_Oop_Class_Struct_Backwards Compatibility - Fatal编程技术网

C++ 在C++;,为什么struct实际上是类?

C++ 在C++;,为什么struct实际上是类?,c++,oop,class,struct,backwards-compatibility,C++,Oop,Class,Struct,Backwards Compatibility,那里的情况和反应让我问了这个问题: 的行为与类< /代码>相同?一方面,C++通过使成员默认为公共(如C)而使其与 C结构>代码兼容,而另一方面,它允许它继承类,并应用其他面向对象技术(不再像“代码> C结构”/代码>了。为什么它不让它成为没有OOP的纯旧的C-struct?有什么特别的原因吗?在C中,只有结构可以开始。当指向这些结构的指针被传递到依赖于该结构的一组库函数时,面向对象开始于库的设计。Win32 API就是一个很好的例子。它不是C++接口,而是C接口;但它仍然是面向对象的 类几乎

那里的情况和反应让我问了这个问题:


<为什么C++允许<代码>结构> <代码>的行为与<代码>类< /代码>相同?一方面,C++通过使成员默认为公共(如C)而使其与 C结构>代码兼容,而另一方面,它允许它继承类,并应用其他面向对象技术(不再像“代码> C结构”/代码>了。为什么它不让它成为没有OOP的纯旧的
C-struct
?有什么特别的原因吗?

在C中,只有结构可以开始。当指向这些结构的指针被传递到依赖于该结构的一组库函数时,面向对象开始于库的设计。Win32 API就是一个很好的例子。它不是C++接口,而是C接口;但它仍然是面向对象的

类几乎与内存结构相同。成员函数不作为类成员数据的一部分存储。它只是一个末端有额外函数指针的结构。因此,类的函数表被解除引用的方式与Windows API使用面向对象的方式相同,但它封装了它,所以您看不到它


遗传、多态性;谁在乎呢?人们对C的评价很好,C.

仍然很好,它允许用更自然的方式将现有的结构与C++代码相结合。例如,您可以将成员函数添加到结构并从结构继承,如果结构和类居住在不同的宇宙中,这是不可能的


Stroustrup的初衷是避免传统C风格的“结构”阵营和OO“类”人群之间的社区分裂。他还提到了只有一个概念而不是两个概念的好处。

允许声明为struct的东西真正成为类,这样在创建C接口时就可以实现类型安全

您可以为C接口主动声明结构:

struct Foo;
您可以在上面声明方法

void doStuffThatModifiesFoo( struct Foo * foo, ... );
struct Bar getStuffFromFoo( const struct Foo * foo );
您还可以为它编写创建和销毁方法

在下面,您将Foo实现为类而不是C结构,但是您的C客户机不需要知道这一点。这比把它作为一个空洞传来传去,然后施放要好(如果有人把一个空洞传给你,你就施放了它,这是不安全的)

  • 结构字段的“public”默认值是与C兼容所必需的 可以访问结构字段的代码
  • 结构继承需要“public”默认值,以便子类 可以用来代替基本结构
  • 可以将struct转换为与类不同的数据类型 (即不允许访问类型说明符和其中的方法),但这两者都可以 编程不方便,给编译器增加了很多不必要的工作 开发者

  • 从语言的角度来看,结构和联合只是类的类型。如果概念更少(用小写字母“c”),那么语言规范就更简单,而且如果必须为每个结构、并集和非结构、非并集类详细说明每个公共属性,那么指定语言就更不容易出错,因为不太容易漏掉一些“明显”的东西

    C++类在C结构上有很多潜在的功能,但是C结构可以看作是退化C++类,最简单的是允许它们完全是这样的。有一个特殊的结构概念和一个类概念是没有好处的

    摘自ISO/IEC 14882:2003,9[类别]/4:

    结构是用类键
    struct
    定义的类;默认情况下,其成员和基类是公共的。联合是使用类键
    联合定义的类
    ;默认情况下,其成员是公共的,并且一次只保存一个数据成员

    <> >“与C兼容”问题仅指向一个方向:旧的、有效的C代码也应该编译为C++代码。另一方面,只要使用C++语言的任何语言特征,就不可能。

    这意味着在C++中,你总是写类,你可以省略使用关键字<代码>结构> /COD>虽然有些人,包括我,认为他们很方便,显示一个类只是一个简单的命名值集合,没有真正的封装或可能复杂的行为。

    你最近的关于“为什么C++ + BLAH……”的问题都可以回答为什么“为什么不?”我喜欢C++这样做,开发标准的人也喜欢它,这就是他们为什么这么做的原因。YBangalbuli:现在我不仅探索C++语法/用法,而且还研究它们背后的哲学。这就是为什么你会看到“为什么C++ + BLAH……”。那么也许你应该读一读《c++的设计与发展》@jk:看起来。我想我应该开始读书了。谢谢你的建议。:-)严格地说,这不是类与结构的关系。在纯C中同样的技巧是可能的,但是在C++中实现某些东西时仍然是有用的,但是它需要用它的成员函数将结构作为全局函数的结构来公开。“它允许现有的结构以更自然的方式与C++代码相配合。例如,可以将成员函数添加到Stutt[.]”中。是的,这就是我的问题:为什么它允许我们添加成员函数?我们有这样的类,对吗?@Nawaz它还允许向联合添加成员函数。我们不能用类来代替联合,因为它们是用来做的。@Johannes Schaub:在“联合”的情况下,这是有道理的,因为“我们不能用类来代替联合,因为它们是用来做的”。这很有道理。但是struct呢?似乎减少破裂的更好的解决方案是根本不创建
    关键字<代码>结构具有更好的默认值。您可以创建一个有用的
    struct
    ,而无需提及任何访问说明符或
    friend
    声明,但不能使用<