C++ 类,用于防止对象复制2024年8月28日 | 阅读 4 分钟 C++ 类实例有时根本不应该被克隆。阻止此类对象复制有三种方法:不可复制的混入、私有拷贝构造函数和赋值运算符,或者删除这些特定的成员函数。 移动表示文件包装器流的类实例是不合适的。它会使实际的 I/O 系统处理复杂化。类似地,如果实例具有特殊的私有对象,则复制指针是无用的。对象切片问题是一个有些相似但并非完全相同的话题。 下图所示的简单类 Vehicle 旨在拥有一个唯一的拥有者,即 Person 的一个实例。 因此,实现 Person 只需执行以下操作 一个名为 info() 的辅助方法被实现以说明问题,如下所示 这个例子清楚地表明 Car 实例不能被克隆。例如,同一个所有者不应该自动拥有相同汽车的第二个副本。事实上,当执行以下代码时 将给出输出 Owner is Joe Sixpack Owner is Joe Sixpack 如何阻止这种意外的对象复制? 方法 1:私有拷贝构造函数和拷贝赋值运算符 声明拷贝赋值运算符和拷贝构造函数为私有是一种常用策略。甚至不需要它们的实现。目的是确保任何尝试完成复制或赋值的操作都会导致编译错误。 在上面的例子中,Car 将被修改为如下所示。请仔细检查私有成员中的另外两个类成员。 现在,如果我们再次尝试将 Car 实例赋值给一个新实例,编译器将大声抗议 如果编写两行包含相同名称的代码太耗时,可以使用宏代替。根据 WebKit 的 wtf/Noncopyable.h 中的 WTF MAKE NONCOPYABLE 宏,WebKit 采用了这种方法(不用担心,在 WebKit 源代码的上下文中,这里的 WTF 代表 Web Template Framework)。Chrome 浏览器代码中使用的 base/macros.h 文件中的 DISALLOW COPY 和 DISALLOW ASSIGN 宏区分了拷贝构造函数和赋值。 方法 2:不可复制的混入 上述概念可以扩展,以构建一个特定类,其主要功能是禁止对象复制。它通常被称为 Noncopyable,并经常用作混入。因此,我们示例中的 Car 类可以继承自此 Noncopyable。 Boost 用户可能已经熟悉上述混入的 Boost 版本,boost::noncopyable。以下是该混入的概念性独立实现示例 我们出色的 Car 类的写法如下 与第一个选项相比,使用 Noncopyable 的优点在于目标非常明确。只需快速查看类的第一行,您就可以判断其实例不应该被克隆。 方法 3:删除了拷贝赋值运算符和拷贝构造函数 对于较新的应用程序,上述变通方法变得越来越不必要。C++11 突然使问题变得简单:只需删除拷贝构造函数和赋值运算符。相反,我们的类将如下所示 值得注意的是,如果您将 boost::noncopyable 混入与支持 C++11 的编译器一起使用,boost::noncopyable 实现也会自动删除上述成员函数。 使用此方法,任何意外的复制都会产生更友好的错误消息 下一个主题C++ 中的原始字符串字面量 |
在计算机科学中,排序算法经常用于以特定顺序排列数据。有许多种排序算法,每种算法都有其自身的优点和缺点。希尔排序是最常用的排序算法之一,有时也称为...
阅读 4 分钟
中缀表达式中缀表达式是一种表达式,其中运算符(+、-、*、/)写在两个操作数之间。例如,考虑以下表达式:A + B A + B - C (A + B) + (C - D) 在这里,我们在操作数之间写了 '+' 运算符...
阅读 4 分钟
在本文中,您将了解 C++ 中的 offsetof() 宏函数及其语法和示例。<<cstddef> 或 <stddef.h> 头文件包含 C++ 中的 offsetof() 宏,该宏用于查找给定成员在结构或类中的偏移量。它是...
阅读 4 分钟
本节将通过 C++ 编程语言中的示例讨论向上转型和向下转型。当我们把一种数据类型转换成另一种类型时,这个过程叫做类型转换。但是,向上转型和向下转型是对象类型转换的类型。假设父类和子类……
阅读 3 分钟
在本文中,您将了解 C++ 中的 is_open 函数及其语法和示例。is_open 函数是什么?在 C++ 中,is_open() 函数用于确定文件流是否已打开。它接受一个文件流对象作为输入,并返回一个布尔值,指示……
阅读 4 分钟
在 C++ 中对元素进行排序时,会计算每个元素的频率,然后根据元素的排序顺序来确定。您可以通过使用 std::sort 等排序算法以及 std::map 和 std::unordered_map 等数据结构来完成此工作。信息...
阅读 3 分钟
引言:三元表达式在编程语言中被广泛使用,它为我们提供了一种表达条件语句的非常清晰的方式。它们的独特结构在分析过程中也带来了挑战。在本文中,我们将讨论如何使用 C++ 中的堆栈将三元表达式转换为二叉树...
7 分钟阅读
Diffie-Hellman 算法是一种在公共通道上交换加密密钥的有效方法。它是最早的公钥协议之一。Diffie-hellman 密钥交换由 Ralph Merkle 发明,并以 Whitfield Diffie 和 Martin Hellman 的名字命名。DH (Diffie-Hellman) 是第一个实例...
阅读 6 分钟
在本教程中,我们将学习如何在 C++ 中创建计时器。秒表在按下键盘上的任意键时开始,在按下另一个键之前不会结束。让我们学习如何在 C++ 中创建计时器。我们将使用一个名为...的函数。
阅读9分钟
在本文中,我们将讨论 C++ 中 forward_list::emplace_front() 函数的语法和示例。在 C++ STL 中,前向列表实现了单链表。C++11 中引入的前向列表比其他类型的容器在插入、删除和移动操作方面更有帮助...
阅读 2 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India