关于一个空类的问题

最近面试老是被问道关于一个空类的问题

被问麻了

来总结一下

空类默认成员

1
2
3
class A
{
};

对于这样一个空类,编译器会自动生成

默认构造函数

拷贝默认构造函数

默认拷贝赋值操作

默认析构函数

取值运算符

取值运算符const

这些函数都是inline和public的

等价于

1
2
3
4
5
6
7
8
9
10
class A
{
public:
A();
A(const A&);
~A();
A& operator = (const A&);
A* operator&();
const A* operator&() const;
};

空类的大小

用以下代码实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<bits/stdc++.h>
using namespace std;


class A
{};

class B{
public:
B(){}
B(const B& ){}
~B(){}

B& operator =(const B&){}
B* operator& (){}
const B* operator& () const{}
};
signed main()
{
A a;
B b;
cout<<sizeof(a)<<"\n";
cout<<sizeof(b)<<"\n";
return 0;
}
image-20220909162146965

空类占一个字节

为什么空类会占一个字节呢?

因为空类是可以实例化的

实例化就是在内存中分配空间,所以虽然空类里面没东西,但是需要占一个字节来区分不同的对象