为什么C++有类和结构体?

为什么C++有类和结构体?

问题描述:

可能重复:
What are the differences between struct and class in C++为什么C++有类和结构体?

如果结构和类之间的唯一区别是默认访问说明符(在C++),那么为什么C++也有课吗?

+0

看到[结构与类](http://stackoverflow.com/questions/2750270/cc-struct-vs-class) – mbx 2011-04-20 20:47:56

+0

http://stackoverflow.com/questions/543515/structs-vs-classes- in-c似乎可能是相关的,等等。 – 2011-04-20 20:48:09

+0

@格雷格我不要求什么差别... – Lockhead 2011-04-20 20:51:54

首先,它与C向后兼容。012第二(也是更重要的一点),它有助于描述你的意图。标准约定是POD应该用struct表示,并且数据和行为的集合应该用class表示。

+0

那么为什么类结构允许在结构中使用类运算符,比如运算符重载?这不会破坏兼容性吗? – Lockhead 2011-04-20 20:53:23

+1

在这种情况下,它是关于* convention *的。通过这个和许多其他方式,C++可以让你做很多事情,不管它们是不是好主意。 – Joe 2011-04-20 21:04:00

+2

@MisterSir - no,**向后**兼容性意味着使用结构的C代码将在C++下按预期进行编译和工作。你的例子(结构与行为)是一个C++代码,当然它不会在C下工作,因为C++不能保证**转发**兼容性 – davka 2011-04-20 21:06:40

你想要类具有默认的访问说明符设计面向对象的层次结构时,是私人的,但结构需要有默认的访问说明符是公众C.

保持向后兼容性与C兼容性C没有课,但它有结构。

请注意,这仅仅是.c文件文本中的“向后兼容性”。在C++中,结构实际上是类,默认曝光度为public,而不是默认曝光度private

class Bob { 
    // I haven't overridden the exposure, so it's private 
    int age; 
    int height; 

    public: 
    Bob(); 

}; 


struct Bob { 
    // I haven't overridden the exposure, so it's public 
    int age; 
    int height; 

    // note the constructor defaults to the "default" constructor. 
}; 

甲真正的C样式结构被定义为这样

extern "C" { 
    struct Bob { 
    int age; 
    int height; 
    }; 
} 

在这种情况下,年龄变得更加的“偏移量0”和高度变更的“偏移+别名(别名而不是被它可以在任何需要的方式实现的概念领域的sizeof(int)的+对准内存管理边界)。

+0

-1废话; 'extern“C”'用于指定链接。它不是*“放入C语言”开关。例如'extern“C”{struct T {T(){}}; }'是完全有效的。 (您的答案的其余部分是正确的。) – 2011-04-24 16:36:35

+0

我的文章中声明“放入C语言”的部分在哪里?我只是说“一个真正的C风格结构是这样定义的......” – 2011-04-24 16:39:40

+0

是的,这是不正确的。你仍然在声明+定义一个C++结构体。 (虽然我现在看到,也许你只是想谈论C兼容性?) – 2011-04-24 16:43:08

至于其他人已经发布,主要的区别是默认的保护水平(即公共或私营)。但是,这也是一个很好的指示实际使用的 数据结构。例如,有时您可能需要一个轻量级结构,类似于java bean。在这种情况下,你可能只是:

class point { 
public: 
    float x, y; 
}; 

这是不太清楚你的意图是什么:

struct point { 
    float x, y; 
}; 

它,你不使用任何C++特性在这里,对明显。我可能会注意到第二个例子是不好的代码,因为有人没有提供getter和setter。