C++空类中默认有什么函数(代码列举所有默认函数并使用)

理解空类(即没有数据成员或显式声明的成员函数的类)中自动生成的成员函数对于理解C++的继承和对象模型非常重要。我们逐一讨论这些函数,并在空类的代码中给出它们的定义。

一、空类中自动生成的成员函数

1. 默认构造函数

无参数构造函数。当你创建一个类的对象时,如果没有提供任何参数,编译器将调用默认构造函数来初始化对象。默认构造函数可以是显式定义的,也可以由编译器自动生成。

2. 拷贝构造函数

通过同类对象创建新对象的构造函数。当你用一个对象初始化另一个对象时(例如通过传递参数给函数、通过值传递参数、返回对象等),拷贝构造函数会被调用,用于创建新对象并初始化它,其内容与原对象相同。

3. 拷贝赋值运算符

通过同类对象赋值的运算符。当你使用赋值操作符(=)将一个对象的值赋给另一个对象时,拷贝赋值运算符会被调用。它将原对象的值复制到目标对象中,并确保两个对象的状态相同。

4. 移动构造函数(自C++11起)

通过右值引用创建新对象的构造函数。移动构造函数用于在从一个临时对象(右值)到另一个对象的转移时,避免不必要的资源复制,提高性能。移动构造函数通常会接受一个右值引用参数(&&)。

5. 移动赋值运算符(自C++11起)

通过右值引用赋值的运算符。移动赋值运算符类似于移动构造函数,但是它用于赋值操作。当你用一个临时对象(右值)赋值给另一个对象时,移动赋值运算符会被调用。

6. 析构函数

销毁对象的函数。当对象超出作用域、被删除或程序结束时,析构函数会被自动调用。它用于执行对象的清理工作,例如释放资源、关闭文件等。

这些函数的正确实现对于正确管理对象的生命周期至关重要,特别是在涉及到资源管理、内存分配等方面。

二、代码示例

#include <iostream>
#include <utility> // For std::move

class Empty 
{
public:
    // 默认构造函数
    Empty() 
    {
        std::cout << "Default constructor called." << std::endl;
    }

    // 拷贝构造函数
    Empty(const Empty& other) 
    {
        std::cout << "Copy constructor called." << std::endl;
    }

    // 拷贝赋值运算符
    Empty& operator=(const Empty& other) 
    {
        std::cout << "Copy assignment operator called." << std::endl;
        return *this;
    }

    // 移动构造函数(自C++11起)
    Empty(Empty&& other) noexcept 
    {
        std::cout << "Move constructor called." << std::endl;
    }

    // 移动赋值运算符(自C++11起)
    Empty& operator=(Empty&& other) noexcept 
    {
        std::cout << "Move assignment operator called." << std::endl;
        return *this;
    }

    // 析构函数
    ~Empty() 
    {
        std::cout << "Destructor called." << std::endl;
    }
};

int main() 
{
    // 使用默认构造函数
    Empty e1;

    // 使用拷贝构造函数
    Empty e2 = e1;

    // 使用拷贝赋值运算符
    Empty e3;
    e3 = e1;

    // 使用移动构造函数(自C++11起)
    Empty e4 = std::move(e1);

    // 使用移动赋值运算符(自C++11起)
    Empty e5;
    e5 = std::move(e2);

    // 观察析构函数的调用
    // 在main函数结束时,所有对象都会被销毁,并调用析构函数

    return 0;
}

运行结果:

Default constructor called.
Copy constructor called.
Default constructor called.
Copy assignment operator called.
Move constructor called.
Move assignment operator called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.

每个输出的含义:

  • 首先,创建了一个名为 e1 的对象,调用了默认构造函数。
  • 接着,使用拷贝构造函数创建了 e2 对象。
  • 然后,创建了 e3 对象,并使用拷贝赋值运算符将其初始化为 e1 对象。
  • 接下来,使用移动构造函数创建了 e4 对象,这里的 e1 对象被转移了资源所有权。
  • 最后,使用移动赋值运算符将 e2 的资源所有权转移到 e5 对象。
  • main() 函数结束时,每个对象的析构函数被调用以销毁对象,按照创建的顺序逆序调用。

这些输出结果展示了空类中各个成员函数的调用情况,有助于理解编译器生成的默认行为。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值