迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

在 C++ 中使用复制构造函数

作者:迹忆客 最近更新:2023/03/15 浏览次数:

本文解释了如何在 C++ 中使用复制构造函数的几种方法。

在 C++ 中使用复制构造函数从另一个相同类型的对象初始化一个对象

类中有几个操作统称为复制控制。这些操作定义了如何复制、移动、分配或销毁给定类类型的对象。在本文中,我们将只关注复制构造函数和复制赋值。

复制构造函数通过复制作为引用传递的参数的值来初始化对象(它通常作为 const 引用传递)。该类不需要像任何其他复制控制操作一样定义复制构造函数,因为编译器会自动为未定义的操作定义合成操作。不过,通常后者可能会导致问题。合成复制构造函数将参数对象的每个成员复制到正在创建的对象。可能有一些其他类类型的成员,它们被它们的复制构造函数复制。相比之下,内置类型对象是直接复制的。

以下示例代码演示了 MyClass 的复制构造函数的行为,它采用复制构造函数的唯一必需参数,然后初始化数据成员。另一方面,复制构造函数可以有额外的参数,这些参数必须是可选的并且有默认值。

当第一次创建 MyClass 类型的对象时,会调用默认构造函数;但是,如果我们将 m1 分配给新创建的 m3 变量,则会调用复制构造函数。后一种操作也称为复制初始化,它可以使用复制构造函数或移动构造函数(在另一篇文章中讨论)。

#include <iostream>

using std::cout; using std::endl;
using std::pair;

class MyClass {
private:
    int n1{};
    int n2{};
public:
    MyClass(int x, int y) : n1(x), n2(y) {
        cout << "Constructor 1 is called" << endl;
    };

    MyClass(const MyClass& src) {
        cout << "Copy Constructor is called " << endl;
        n1 = src.n1;
        n2 = src.n2;
    }

    auto getPair() { return pair<int, int>(n1, n2); }

    ~MyClass() = default;
};


int main() {
    MyClass m1(12, 21);
    cout << "------------------" << endl;
    MyClass m2(11, 33);
    cout << "------------------" << endl;
    MyClass m3 = m1;
    cout << "------------------" << endl;

    cout << m1.getPair().first << m1.getPair().second << endl;
    cout << m2.getPair().first << m2.getPair().second << endl;
    cout << m3.getPair().first << m3.getPair().second << endl;

    return EXIT_SUCCESS;
}

输出:

Constructor 1 is called
------------------
Constructor 1 is called
------------------
Copy Constructor is called
------------------
1221
1133
1221

使用复制赋值运算符在 C++ 中定义对象的赋值运算符重载

复制赋值运算符定义了如何分配相同类型的对象。如果用户没有明确定义它,编译器也会综合这个操作。复制赋值的描述类似于其他运算符重载函数。它采用与类相同类型的参数,通常返回对左侧操作数的引用。复制赋值运算符必须定义为成员函数。

下一个代码片段为 MyClass 添加复制赋值运算符,并在将 m2 对象分配给 m1 时调用它。

#include <iostream>

using std::cout; using std::endl;
using std::pair;

class MyClass {
private:
    int n1{};
    int n2{};
public:
    MyClass(int x, int y) : n1(x), n2(y) {
        cout << "Constructor 1 is called" << endl;
    };

    MyClass(const MyClass& src) {
        cout << "Copy Constructor is called " << endl;
        n1 = src.n1;
        n2 = src.n2;
    }

    MyClass& operator=(const MyClass& src){
        cout << "Copy Assignment is called " << endl;
        n1 = src.n1;
        n2 = src.n2;
        return *this;
    }

    auto getPair() { return pair<int, int>(n1, n2); }

    ~MyClass() = default;
};


int main() {
    MyClass m1(12, 21);
    cout << "------------------" << endl;
    MyClass m2(11, 33);
    cout << "------------------" << endl;
    MyClass m3 = m1;
    cout << "------------------" << endl;
    m1 = m2;
    cout << "------------------" << endl;

    cout << m1.getPair().first << m1.getPair().second << endl;
    cout << m2.getPair().first << m2.getPair().second << endl;
    cout << m3.getPair().first << m3.getPair().second << endl;

    return EXIT_SUCCESS;
}

输出:

Constructor 1 is called
------------------
Constructor 1 is called
------------------
Copy Constructor is called
------------------
Copy Assignment is called
------------------
1221
1133
1221

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Arduino 中停止循环

发布时间:2024/03/13 浏览次数:444 分类:C++

可以使用 exit(0),无限循环和 Sleep_n0m1 库在 Arduino 中停止循环。

Arduino 复位

发布时间:2024/03/13 浏览次数:315 分类:C++

可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。

Arduino 的字符转换为整型

发布时间:2024/03/13 浏览次数:181 分类:C++

可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。

Arduino 串口打印多个变量

发布时间:2024/03/13 浏览次数:381 分类:C++

可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。

Arduino if 语句

发布时间:2024/03/13 浏览次数:123 分类:C++

可以使用 if 语句检查 Arduino 中的不同条件。

Arduino ICSP

发布时间:2024/03/13 浏览次数:214 分类:C++

ICSP 引脚用于两个 Arduino 之间的通信以及对 Arduino 引导加载程序进行编程。

使用 C++ 编程 Arduino

发布时间:2024/03/13 浏览次数:127 分类:C++

本教程将讨论使用 Arduino IDE 在 C++ 中对 Arduino 进行编程。

Arduino 中的子程序

发布时间:2024/03/13 浏览次数:168 分类:C++

可以通过在 Arduino 中声明函数来处理子程序。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便