C++ 类的6个缺省函数

文章介绍了C++中默认产生的6个类成员函数,即缺省构造、拷贝构造、析构、赋值运算符、取址运算符和取地址运算符const。指出很多人认为只有前4个缺省函数的误区,还说明空类编译器不会生成成员函数,只会加1个字节占位符,缺省函数在需要时才会生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章来源:https://blog.youkuaiyun.com/l953972252/article/details/51628595

在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指针)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值