为什么允许C++类拥有零数据成员?

use*_*015 8 c++

关于c ++的问题为什么类定义中的最小数据成员数为零

我认为它应该是一个,即指向编译器定义的虚拟表的指针

非常感谢

Jam*_*lis 22

在继承层次结构中使用没有数据成员的类通常很有用.

基类可能只有几个typedef在多个类中使用的s.例如,std::iterator类模板只定义了标准类型,因此您无需在每个迭代器类中定义它们.

接口类通常没有数据成员,只有虚拟成员函数.

虚拟表与类的数据成员无关.


Bil*_*eal 5

好吧,实际上C++要求所有类必须占用一些空间(您需要能够生成指向该类的指针).如果类是多态的,它们只需要一个指向vtable的指针.在单形课中根本没有理由说vtable.

  • 我不认为规范要求一个类有一个大小(可能是错误的).它的功能是每个对象都有一个唯一的地址.最简单的实现技术是确保每个类的大小都大于零(否则,您需要对零大小的对象进行特殊处理,以确保它们都具有唯一的地址). (3认同)
  • 请问亚纯级是什么? (2认同)

Kon*_*lph 5

我正在开发一个有时甚至使用类型的库 - 喘气!- 甚至没有定义,更不用说有数据成员了!

也就是说,类型不完整,例如

struct foobar;
Run Code Online (Sandbox Code Playgroud)

这用于创建一个明确的名称,仅此而已.

那有什么用呢?好吧,我们使用它来创建不同的标签,使用额外的(空的,但完全定义的)类型:

template <typename TSpec>
struct Tag { };
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样创建不同的标签:

struct TagForward_;
typedef Tag<TagForward_> ForwardTag;

struct TagRandomAccessible_;
typedef Tag<TagRandomAccessible_> RandomAccessibleTag;
Run Code Online (Sandbox Code Playgroud)

这些反过来可用于消除专门的重载歧义.许多STL实现都做类似的事情:

template <typename Iter>
void sort(Iter begin, Iter end, RandomAccessibleTag const&) …
Run Code Online (Sandbox Code Playgroud)

严格地说,通过公共Tag类模板的间接路由是多余的,但是为了文档起见它是一个有用的技巧.

所有这些只是为了表明(严格的,静态的)类型系统可以以多种不同的方式使用,而不仅仅是捆绑和封装数据.

  • 那些名字只是为了说明这个例子吗?带有前导下划线后跟大写字符的名称保留给实现:) (2认同)