C++ - 结构体 vs 类

51
在《C++ In a Nutshell》一书中,在第6章“类”中,提到了以下内容:
在类定义中,成员和基类的默认访问权限是private。在结构体定义中,默认访问权限是public。这是类和结构体之间唯一的区别,尽管按照惯例,一些程序员只将结构体用于POD类,并将类用于其他所有类。
我的问题是:
1. 类和结构体之间不是还有另一个区别吗?结构体只保存数据,不保存函数,对吗? 2. 什么是POD类?这里所说的其他类是指什么?那么是否有特殊的类?

C++中,结构体(struct)和类(class)的区别是什么? - Charles Salvia
@aali == @SWEngineer 的副本吗? - Paul R
http://www.cplusplus.com/doc/tutorial/classes/#struct_and_union - Brandon
5个回答

94

另一个不同之处在于

template<class T> ...

是允许的,但是

template<struct T> ...

不是。


21
独特方法加一分。 - Grozz
16
使用模板的官方方式是 template<typename T>template<class T> 这种写法有些误导人,只是由于历史原因而存在。 - Peter Lee
然后再增加一个int类型和类之间的不同之处……!! template<class T>... 可以工作,但是 template<int T>... 不行 - Asif Mushtaq
@UnKnown,当然可以,我们之所以将整数称为“ I”,“ J”,“ K”,“ L”是出于历史原因。 - Simon Richter

40

如果你试图在结构体中定义一个函数,你可以证明没有其他区别。 我记得我的大学教授在教授C++中的结构体和类时被学生纠正后,他很惊讶。 尽管如此,我相信这一点。 这有点有趣。 教授一直说差别在哪里,而学生则不断地说“实际上你也可以在结构体中做到这一点”。 最后,教授问:“好吧,有什么区别”,学生告诉他唯一的区别是成员的默认可访问性。

快速的谷歌搜索表明POD代表"Plain Old Data"。


9
那位老师的日子不好过,毫无疑问 :) - Alex
那位老师试图探索/学习C语言中结构体和类的区别,而不是C++,因为在C语言中我们无法在结构体中添加函数。 - Asif Mushtaq
C语言甚至没有类 :P 人们只是认为C++中的结构体不能有方法,因为他们认为C++是C的超集,这导致了错误的假设,即C++结构体与C结构体相同。 - Chris Rollins

8

POD类是只包含数据成员而没有其他成员的普通数据类。关于这个问题在stackoverflow上有一些相关的提问,你可以在这里找到。

此外,在C ++中可以将函数作为结构体的成员,但在C中不能。在C中需要将函数指针作为结构体的成员。


3

好的,POD指的是“普通旧数据”。通常指没有任何方法的structs,因为这些类型用于组织归属于一起的多个数据。

至于structs没有方法:我曾经看到过一个struct有方法,我不觉得这是不自然的。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接