在 C++ 中使用复制构造函数
本文解释了如何在 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
相关文章
在 C++ 中通过掷骰子生成随机值
发布时间:2023/04/09 浏览次数:169 分类:C++
-
本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。
在 C++ 中使用模板的链表
发布时间:2023/04/09 浏览次数:158 分类:C++
-
本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。
在 C++ 中添加定时延迟
发布时间:2023/04/09 浏览次数:142 分类:C++
-
本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。
在 C++ 中创建查找表
发布时间:2023/04/09 浏览次数:155 分类:C++
-
本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。
如何在 C++ 中把字符串转换为小写
发布时间:2023/04/09 浏览次数:63 分类:C++
-
介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码
如何在 C++ 中确定一个字符串是否是数字
发布时间:2023/04/09 浏览次数:163 分类:C++
-
本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。
如何在 c++ 中查找字符串中的子字符串
发布时间:2023/04/09 浏览次数:65 分类:C++
-
本文介绍了在 C++ 中检查一个字符串是否包含子字符串的多种方法。使用 find 方法在 C++ 中查找字符串中的子字符串
如何在 C++ 中把字符串转换为 Char 数组
发布时间:2023/04/09 浏览次数:107 分类:C++
-
本文介绍了在 C++ 中把字符串转换为 char 数组的多种方法。使用 std::basic_string::c_str 方法将字符串转换为 char 数组