网址导航网站制作工具/百度品牌广告是什么
文章来源:https://blog.csdn.net/l953972252/article/details/51628595
在C++中默认产生6个类成员函数,即缺省函数,它们分别是:
- 缺省构造函数
- 缺省拷贝构造函数
- 缺省析构函数
- 缺省赋值运算符
- 缺省取址运算符
- 缺省取地址运算符const
很多人以为只有前4个缺省函数,事实上有6个。
代码验证如下:
#include <iostream>
using namespace std;class A
{
public:A(){cout<<"构造函数"<<endl;}~A(){cout<<"希构函数"<<endl;}A(const A &){cout<<"拷贝构造函数"<<endl;}A& operator=(const A &){cout<<"赋值运算"<<endl;}A* operator&(){cout<<"取地址"<<endl;}const A* operator&()const{cout<<"const取地址"<<endl;}
};int main(int argc, char **argv)
{A c1;A c2 = c1;c2 = c1;A *pa = &c1;const A c3;const A * pb = &c3;return 0;
}
可见,我们在没有写函数功能的情况下,进行构造,析构,拷贝等等操作都是可以实现的,这就是6个缺省函数的功劳了。
注意,很多人在这里有一个误区。
是不是构造一个 空类,这个空类就已经有6个默认缺省函数了?
这是错误的!请看代码:
#include <iostream>
using namespace std;class A
{};int main()
{cout<<"空类A的大小:"<<sizeof(A)<<endl;return 0;
}
测试空类的大小,得出: 空类A的大小为 1 。
对于空类,编译器不会生成任何成员函数!只会生成1个字节的占位符。
空类也是可以被实例化的,而每个实例在内存中都是独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后就可以得到了独一无二的地址,这就是一个占位符的意义。
那么什么时候才会生成6个缺省默认成员函数呢?
编译器只会在需要的时候生成,也就是说,在第一个代码main()中:
A c1; 构造c1才会生成构造函数;
A c2 = c1; 拷贝构造c2时才会生成拷贝构造函数;
同样析构c1,c2时,才会构造析构函数,依次类推~
(也会默认构造一个this指针)