C++类和对象之类的6个默认成员函数详解

C++类和对象之类的6个默认成员函数详解

什么是类和对象

类是一种用户自定义的数据类型,用于描述一组具有相同属性和行为的对象的集合。一个类可以包含数据成员和成员函数(也称为方法),这些成员封装了类的状态以及处理这些状态的操作。

对象是类的实例,它是使用类定义的变量。每个对象都具有自己的状态和行为,但所有对象都共享类的数据成员和成员函数。

默认成员函数

在C++中,每个类都有6个默认成员函数,这些函数是在类被定义时自动生成的,如果未提供,则会使用默认实现。这6个默认成员函数分别为:

  1. 默认构造函数
  2. 带参构造函数
  3. 拷贝构造函数
  4. 赋值运算符重载函数
  5. 移动构造函数
  6. 移动赋值运算符重载函数

这些函数对于类的正确使用和操作非常重要,因此我们需要详细了解它们的默认实现。

默认构造函数

默认构造函数是不需要参数的构造函数,用于创建类的对象。如果用户没有提供自定义的默认构造函数,则编译器会自动生成默认构造函数,该函数不执行任何操作,但确保数据成员被正确初始化。

以下是一个示例代码,可以了解默认构造函数的作用:

// Example 1: 默认构造函数
class MyClass {
public:
    MyClass() {
        std::cout << "默认构造函数被调用" << std::endl;
        m_data = 0; // 初始化数据成员
    }
private:
    int m_data;
};

int main() {
    MyClass object; // 调用默认构造函数创建对象
    return 0;
}

带参构造函数

带参构造函数是一种在创建对象时提供初始化参数的构造函数,用于初始化类的成员变量。如果用户没有提供自定义的带参构造函数,则编译器会自动生成默认构造函数。

以下是一个示例代码,可以了解带参构造函数的作用:

// Example 2: 带参构造函数
class MyClass {
public:
    MyClass(int data) {
        std::cout << "带参构造函数被调用" << std::endl;
        m_data = data; // 初始化数据成员
    }
private:
    int m_data;
};

int main() {
    MyClass object(100); // 调用带参构造函数创建对象
    return 0;
}

拷贝构造函数

拷贝构造函数是一种用于将一个对象拷贝到另一个对象的构造函数。当使用一个对象去初始化另一个对象,或者以值传递的方式传递一个对象时,就会调用拷贝构造函数。如果用户没有提供自定义的拷贝构造函数,则编译器会自动生成默认构造函数。

以下是一个示例代码,可以了解拷贝构造函数的作用:

// Example 3: 拷贝构造函数
class MyClass {
public:
    MyClass(const MyClass& other) {
        std::cout << "拷贝构造函数被调用" << std::endl;
        m_data = other.m_data; // 复制数据成员
    }
    MyClass(int data) {
        m_data = data;
    }
private:
    int m_data;
};

int main() {
    MyClass object1(100); // 创建第一个对象
    MyClass object2 = object1; // 使用拷贝构造函数创建第二个对象
    return 0;
}

赋值运算符重载函数

赋值运算符重载函数是一种用于将一个对象赋值给另一个对象的函数。当使用赋值运算符“=”将一个对象赋值给另一个对象时,就会调用赋值运算符重载函数。如果用户没有提供自定义的赋值运算符重载函数,则编译器会自动生成默认构造函数。

以下是一个示例代码,可以了解赋值运算符重载函数的作用:

// Example 4: 赋值运算符重载函数
class MyClass {
public:
    MyClass(int data) {
        m_data = data;
    }
    MyClass operator=(const MyClass& other) {
        std::cout << "赋值运算符重载函数被调用" << std::endl;
        m_data = other.m_data; // 复制数据成员
        return *this;
    }
private:
    int m_data;
};

int main() {
    MyClass object1(100); // 创建第一个对象
    MyClass object2(200); // 创建第二个对象
    object2 = object1; // 使用赋值运算符重载函数将第一个对象赋值给第二个对象
    return 0;
}

移动构造函数

移动构造函数是一种将一个对象的资源移动到另一个对象的构造函数。当使用一个临时对象初始化一个非临时对象时,就会调用移动构造函数。如果用户没有提供自定义的移动构造函数,则编译器会使用拷贝构造函数替代。

以下是一个示例代码,可以了解移动构造函数的作用:

// Example 5: 移动构造函数
class MyClass {
public:
    MyClass(int data) {
        m_data = new int(data); // 分配内存并初始化指针成员
    }
    // 移动构造函数
    MyClass(MyClass&& other) {
        std::cout << "移动构造函数被调用" << std::endl;
        m_data = other.m_data; // 移动资源
        other.m_data = nullptr; // 释放其他对象的资源,防止双向释放
    }

    ~MyClass() {
        delete m_data; // 释放资源
    }

private:
    int* m_data; // 指针成员
};

int main() {
    MyClass object1(100); // 创建一个临时对象
    MyClass object2 = std::move(object1); // 使用移动构造函数将临时对象的资源移动到第二个对象
    return 0;
}

移动赋值运算符重载函数

移动赋值运算符重载函数是一种将一个对象的资源移动到另一个对象的函数。当使用赋值运算符“=”将一个临时对象赋值给一个非临时对象时,就会调用移动赋值运算符重载函数。如果用户没有提供自定义的移动赋值运算符重载函数,则编译器会使用赋值运算符重载函数替代。

以下是一个示例代码,可以了解移动赋值运算符重载函数的作用:

// Example 6: 移动赋值运算符重载函数
class MyClass {
public:
    MyClass(int data) {
        m_data = new int(data); // 分配内存并初始化指针成员
    }
    ~MyClass() {
        delete m_data; // 释放资源
    }
    // 移动赋值运算符重载函数
    MyClass operator=(MyClass&& other) {
        std::cout << "移动赋值运算符重载函数被调用" << std::endl;
        if (this != &other) { // 避免自赋值
            delete m_data; // 释放当前对象的资源
            m_data = other.m_data; // 移动资源
            other.m_data = nullptr; // 释放其他对象的资源,防止双向释放
        }
        return *this;
    }
private:
    int* m_data; // 指针成员
};

int main() {
    MyClass object1(100); // 创建第一个对象
    MyClass object2(200); // 创建第二个对象
    object2 = std::move(object1); // 使用移动赋值运算符重载函数将临时对象的资源移动到第二个对象
    return 0;
}

以上是C++类和对象以及类的6个默认成员函数的详解和示例。这些默认成员函数非常重要,我们必须了解它们的实现方式,以便正确地使用和操作类和对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类和对象之类的6个默认成员函数详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • U盘双击后无法打开并提示找不到应用程序的原因及解决

    针对“U盘双击后无法打开并提示找不到应用程序”的问题,我们可以进行以下的解决攻略: 原因分析 U盘病毒感染:一些恶意病毒会将U盘上的文件属性进行篡改,导致无法打开并提示找不到应用程序; 应用程序被误删或损坏:在使用U盘的过程中,如果应用程序被误删或者损坏,也会导致U盘双击后无法打开并提示找不到应用程序; U盘上的文件格式不受系统识别:如果U盘上的文件格式不被…

    C 2023年5月23日
    00
  • VS中的scanf_s函数和scanf用法及说明

    VS中的scanf_s函数和scanf用法及说明 1. scanf函数 scanf() 是 C 语言的标准输入函数,可用来接收用户输入的数据。该函数原型为: scanf(const char *format, …) 其中,format 为格式化字符串,”…” 表示可变参数,即可以接受任意个数的参数。 我们可以通过 scanf() 函数来接收用户输入的…

    C 2023年5月23日
    00
  • C++ 简单的任务队列详解

    C++ 简单的任务队列详解 本文介绍了在 C++ 中实现一个简单的任务队列,用来处理异步任务。任务队列常用于多线程编程中,能够提高程序的并发性能。在本文中,我们将详细介绍任务队列的实现思路和步骤。 实现思路 任务队列是一个先进先出(FIFO)的数据结构,通常实现方式是使用队列。任务队列中存储的是待执行的任务。每当一个任务完成后,就从队列中取出下一个任务执行。…

    C 2023年5月22日
    00
  • 如何将JSON字符串数组转对象集合

    将JSON字符串数组转变成对象集合有以下三个步骤: 解析JSON字符串数组成JSON对象 遍历JSON对象,将每个JSON对象转化成目标对象 将转化好的目标对象添加到集合中 下面用JavaScript语言提供两种实现的示例: 示例 1 如下所示的JSON字符串数组: var jsonStrArray = [ ‘{"name":"…

    C 2023年5月23日
    00
  • C 环境设置

    C 环境设置完整使用攻略 什么是 C 环境 C 环境包括编译器、链接器和调试器等,是用来开发 C 语言程序的软件集合。 C 环境设置步骤 1. 下载安装 C 语言编译器 常见的 C 语言编译器有 GCC 和 Clang 等,可根据自己的需求选择合适的编译器并下载安装。以 GCC 编译器为例,下载安装步骤如下: 在官网(https://gcc.gnu.org/…

    C 2023年5月10日
    00
  • 深入讲解数据库中Decimal类型的使用以及实现方法

    下面我来给您详细讲解“深入讲解数据库中Decimal类型的使用以及实现方法”的完整攻略。 深入讲解数据库中Decimal类型的使用以及实现方法 什么是Decimal类型 Decimal类型是一种用于存储精确数值的数据类型。在数据库中常用于存储货币、利率、精度要求高的计算结果等场景。与浮点型(float)不同的是,Decimal类型不会存在精度损失的情况。 D…

    C 2023年5月22日
    00
  • SIGPIPE(Signal 13, Code 0) 异常排查及处理

    SIGPIPE(Signal 13, Code 0) 异常排查及处理 什么是 SIGPIPE SIGPIPE 是指在一个进程(或线程)向另一个进程(或线程)发送数据的时候,如果对方已经关闭了对应的 pipe、socket 或 FIFO 等管道,那么发送数据的进程就会收到 SIGPIPE 信号,这个信号的默认行为是进程终止。通常情况下,这个信号是由于进程发送数…

    C 2023年5月23日
    00
  • 华为揽阅M2平板电脑做工怎么样?华为揽阅M2 10.0指纹平板拆机全过程图解

    华为揽阅M2是一款高性能的平板电脑,其外观和内部设计都十分精细,以下是关于此设备做工的详细分析以及拆机攻略。 华为揽阅M2平板电脑做工分析 外观设计 华为揽阅M2采用了一块10.1英寸的IPS触控屏幕,屏幕分辨率为1920*1200像素,支持10点触控和电磁笔输入。整个设备的外观采用了金属材质,手感舒适,整机重量为约500克。 在机身的四周布置了一些按钮、接…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部