在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1、缺省构造函数。
2、缺省拷贝构造函数。 3、 缺省析构函数。 4、缺省赋值运算符。 5、缺省取址运算符。 6、 缺省取址运算符 const。
<span style="font-size:18px;"> class A { public: A(){}//缺省构造函数 A(const A&){}//拷贝构造函数 ~A(){}//析构函数 A&operator=(const A&){}//赋值运算符 A*operator&(){}//取址运算符 const A*operator&()const{}//取址运算符 const }; </span>
在C++中。编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢? 空类,声明时编译器不会生成不论什么成员函数对于空类。编译器不会生成不论什么的成员函数。仅仅会生成1个字节的占位符。 有时可能会以为编译器会为空类生成默认构造函数等,其实是不会的。编译器仅仅会在须要的时候生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、一对取址运算符和一个this指针。 代码:
<span style="font-size:18px;"> #include <iostream> using namespace std; class Empty_one { }; class Empty_two {}; class Empty_three { virtual void fun() = 0; }; class Empty_four : public Empty_two, public Empty_three { }; int main() { cout<<"sizeof(Empty_one):"<<sizeof(Empty_one)<<endl; cout<<"sizeof(Empty_two):"<<sizeof(Empty_two)<<endl; cout<<"sizeof(Empty_three):"<<sizeof(Empty_three)<<endl; cout<<"sizeof(Empty_four):"<<sizeof(Empty_four)<<endl; return 0; } </span> 结果: 分析: 类Empty_one、Empty_two是空类,但空类相同能够被实例化。而每一个实例在内存中都有一个独一无二的地址,为了达到这个目的。编译器往往会给一个空类隐含的加一个字节。这样空类在实例化后在内存得到了独一无二的地址,所以sizeof(Empty_one)和sizeof(Empty_two)的大小为1。
类Empty_three里面因有一个纯虚函数,故有一个指向虚函数的指针(vptr),32位系统分配给指针的大小为4个字节,所以sizeof(Empty_three)的大小为4。 类Empty_four继承于Empty_two和Empty_three,编译器取消Empty_two的占位符。保留一虚函数表。故大小为4。 2、空类。定义时会生成6个成员函数当空类Empty_one定义一个对象时Empty_one pt;sizeof(pt)仍是为1,但编译器会生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、两个取址运算符。
[html] view
plaincopy
[html] view
plaincopy
[html] view
plaincopy
C++编译器对这些函数的实现:
[html] view
plaincopy
三、总结上述执行结果依赖于编译器和64位、32位不同的系统。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论