C++ 类的6个缺省函数

来源:互联网 发布:淘宝官网网页版 编辑:程序博客网 时间:2024/05/22 03:35

在C++中默认产生6个类成员函数,即缺省函数,它们分别是:

  1. 缺省构造函数
  2. 缺省拷贝构造函数
  3. 缺省析构函数
  4. 缺省赋值运算符
  5. 缺省取址运算符
  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指针)

2 0
原创粉丝点击