在c++中,在哪些情况下使用结构体比使用类更好?
当前回答
只是从c++ 20 standard的角度(从N4860工作)来解决这个问题…
类是一种类型。关键字“class”和“struct”(以及“union”)在c++语法中是“class-key”,选择class或struct的唯一功能意义是:
类键决定是否…默认情况下访问是public或private(11.9)。
数据成员默认可访问性
class关键字的结果是private-by-default成员,而' struct关键字的结果是public-by-default成员,在11.9.1的例子中有说明:
类X { int;// X::a默认为private:使用的类
对…
struct S { int;// S::a默认为public: struct被使用
基类默认可访问性
1.9还说:
在基类没有访问说明符的情况下,当派生类使用类键结构体定义时假定为public,当类使用类键类定义时假定为private。
需要一致使用结构体或类的情况……
有一个要求:
在类模板的重声明、部分特化、显式特化或显式实例化中,类键应与原始类模板声明一致(9.2.8.3)。
...在任何详细类型说明符中,枚举关键字应使用指向枚举(9.7.1),联合类键应使用指向联合(11.5),类或结构的类键必须是 用于指非并体类(11.1)。
以下是不需要一致性的例子:
struct S {} S; 类S* p = &s;/ /好吧
不过,一些编译器可能会对此提出警告。
有趣的是,虽然你用struct、class和union创建的类型都被称为“类”,但我们有…
标准布局结构体是用类键结构体或类键类定义的标准布局类。
...所以在标准语中,当谈到标准布局结构体时,它使用“struct”来暗示“不是联合”。
我很好奇在其他术语中是否也有类似的“struct”用法,但要对标准进行详尽的搜索,工作量太大了。欢迎对此发表评论。
其他回答
回答我自己的问题(无耻地),正如已经提到的,访问权限是c++中它们之间的唯一区别。
我倾向于仅将结构体用于数据存储。我将允许它获得一些帮助函数,如果它使处理数据更容易的话。然而,一旦数据需要流控制(即维护或保护内部状态的getter /setter)或开始获得任何主要功能(基本上更像对象),它将被“升级”为一个类,以更好地传达意图。
c++中类和结构的区别是:
结构成员和基类/结构在默认情况下是公共的。 默认情况下,类成员和基类/结构是私有的。
类和结构都可以混合使用public、protected和private成员,可以使用继承,也可以有成员函数。
我向你推荐:
对于没有任何类样特性的普通旧数据结构使用struct; 在使用私有或受保护成员、非默认构造函数和操作符等特性时使用类。
struct相对于class的一个优点是,如果坚持“首先是public成员,然后是private成员”,它可以节省一行代码。从这个角度来看,我发现关键字class毫无用处。
下面是只使用struct而不使用class的另一个原因。c++的一些代码风格指南建议使用小写字母表示函数宏,其基本原理是当宏转换为内联函数时,不需要更改名称。我也一样。你有了漂亮的c风格结构体,有一天,你发现你需要添加一个构造函数,或者一些方便的方法。你会把它改成一个类吗?到处都是吗?
区分结构体和类实在是太麻烦了,妨碍了我们做应该做的事情——编程。像c++的许多问题一样,它产生于向后兼容的强烈愿望。
正如其他人所指出的那样,真正的语言差异只有两个:
Struct默认为公共访问,class默认为私有访问。 继承时,struct默认为公共继承,class默认为私有继承。(具有讽刺意味的是,与c++中的许多东西一样,默认是反向的:公共继承是迄今为止更常见的选择,但人们很少声明结构只是为了节省键入“public”关键字。
但在实践中,真正的区别在于声明构造函数/析构函数的类/结构与未声明构造函数/析构函数的类/结构之间的区别。对于“普通的旧数据”POD类型有一定的保证,一旦接管类的构造就不再适用。为了明确这种区别,许多人故意只对POD类型使用结构体,如果他们要添加任何方法,则使用类。下面两个片段之间的区别是没有意义的:
class X
{
public:
// ...
};
struct X
{
// ...
};
(顺便提一句,这里有一个线程,对“POD类型”的实际含义有一些很好的解释:c++中的POD类型是什么?)
默认情况下,结构具有公共访问权限,类具有私有访问权限。
就我个人而言,我使用结构作为数据传输对象或作为值对象。当这样使用时,我将所有成员声明为const,以防止其他代码修改。
推荐文章
- 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?
- 公共朋友交换成员函数
- 如何在Go中使用c++
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- 接口方法的最终参数-有什么意义?
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- 在Java中使用“final”修饰符
- C++ Linux的想法?
- 如何为Fedora安装g++ ?
- Std::cin输入空格?
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?