对于空类,声明编译器不会生成任何的成员函数,只会生成 1 个字节的占位符。由于在实际程序中,空类同样可以被实例化,而每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以 sizeof(A) 的大小为 1。
C++
#include <iostream>
using namespace std;
class A
{
};
int main()
{
A a;
cout << "sizeof(A):" << sizeof(a) << endl; // sizeof(A):1
return 0;
}
当空类 A 定义对象时,sizeof(A) 仍是为 1,但编译器会在需要时生成 6 个成员函数:缺省的构造函数、拷贝构造函数、析构函数、赋值运算符、两个取址运算符。
C++
#include <iostream>
using namespace std;
/*
class A
{}; 该空类的等价写法如下:
*/
class A
{
public:
A(){}; // 缺省构造函数
A(const A &tmp){}; // 拷贝构造函数
~A(){}; // 析构函数
A &operator=(const A &tmp){}; // 赋值运算符
A *operator&() { return this; }; // 取址运算符
const A *operator&() const { return this; }; // 取址运算符(const 版本)
};
int main()
{
A *p = new A();
cout << "sizeof(A):" << sizeof(A) << endl; // sizeof(A):1
delete p;
return 0;
}
阅读量:646
点赞量:0
收藏量:0