如何创建和使用 ''unique_ptr'' 实例

2024年8月28日 | 阅读 9 分钟

C 和 C++ 编程语言中的实例是什么?

在 C 语言中,实例是指对象或数据结构的单个出现。例如,如果你有一个名为“Dog”的类,你从该类创建的每只狗都将是“Dog”类的实例。这意味着每个类实例都将拥有由类定义的自己的数据和行为集。

例如,你可能创建“Dog”类的两个实例,一个用于名为“Fido”的狗,另一个用于名为“Snoopy”的狗。这两个实例将各自拥有自己的一组特征,例如它们的名称、年龄和品种,以及它们的行为,例如能够吠叫或捡球。

在 C 语言中,你可以使用 new 关键字创建类的实例,如下所示:

语法

在这里,我们创建了“Dog”类的两个实例,一个用于 Fido,另一个用于 Snoopy。每个实例在创建实例时都指定了自己的数据集,例如名称、年龄和品种。

这是一个展示如何在 C 语言中创建名为“Dog”的类,然后创建该类的实例的示例。

编码

在此示例中,“Dog”类有一个构造函数,用于初始化每个类实例的数据。它还有一个“bark”方法,可以让狗吠叫。

在 main 函数中,我们创建了“Dog”类的两个实例,一个用于 Fido,另一个用于 Snoopy。然后,我们对每个实例调用 bark 方法,让狗吠叫。

运行此程序时,它应该会打印以下输出。

输出

Fido says Woof! Woof!
Snoopy says Woof! Woof!

C++ 实例

在 C++ 中,实例是指对象或数据结构的单个出现。例如,如果你有一个名为“Dog”的类,你从该类创建的每只狗都将是“Dog”类的实例。这意味着每个类实例都将拥有由类定义的自己的数据和行为集。

例如,你可能创建“Dog”类的两个实例,一个用于名为“Fido”的狗,另一个用于名为“Snoopy”的狗。这两个实例将各自拥有自己的一组特征,例如它们的名称、年龄和品种,以及它们的行为,例如能够吠叫或捡球。

在 C++ 中,你可以使用 new 关键字创建类的实例,如下所示:

在这里,我们创建了“Dog”类的两个实例,一个用于 Fido,另一个用于 Snoopy。每个实例在创建实例时都指定了自己的数据集,例如名称、年龄和品种。

编码

在此示例中,“Person”类有一个构造函数,用于初始化每个类实例的数据。它还有一个“printing”方法,可以打印人的姓名和年龄。

在 main 函数中,我们创建了“Person”类的两个实例,一个用于 John,另一个用于 Jane。然后,我们对每个实例调用 printing 方法,以打印他们的信息。

运行此程序时,它应该会打印以下输出。

输出

Name: John, Age: 32, Gender: Male
Name: Jane, Age: 28, Gender: Female

首先,什么是指针?

在 C 和 C++ 中,指针是一个变量,它保存另一个变量的内存地址。指针通常指向在运行时动态分配的内存位置,例如在使用 C 中的 malloc 函数或 C++ 中的 new 运算符时。

指针很有用,因为它们允许你直接操作为程序分配的内存,从而让你更精确地控制程序如何使用内存。例如,你可以使用指针来访问和修改特定内存位置中的数据,或者创建比标准库提供的更高效、更灵活的数据结构。

其他语言没有指针,因为它们很难正确使用,并且会使你的代码更难理解和维护。例如,不正确地使用指针可能导致内存泄漏或其他运行时错误,而这些错误可能很难诊断和修复。此外,指针会使代码行为的推理更加困难,因为指针的值可以在运行时动态更改。

但是,其他语言提供了允许你直接操作内存的类似功能,例如 C++ 中的引用或 C# 中的“不安全”代码。这些功能在某些情况下可能很有用,但应谨慎使用,因为它们也可能引入指针可能导致的相同类型的问题。

C 代码

输出

x = 10
ptr = 0x7ffc1e1092ac
*ptr = 10
x = 20
ptr = 0x7ffc1e1092ac
*ptr = 20

C++ 代码

输出

x = 10
ptr = 0x7ffd1cfc1ebc
*ptr = 10
x = 20
ptr = 0x7ffd1cfc1ebc
*ptr = 20

在上面的示例中,ptr 是一个指向 int 变量的指针。& 运算符用于获取 x 变量的地址,* 运算符用于解引用指针并访问存储在该地址的值。然后使用指针修改 x 的值。

什么是智能指针?

在 C 和 C++ 中,智能指针是一种像指针一样的对象,但具有额外的功能,有助于管理被指向对象的生命周期。智能指针可以在不再需要对象时自动删除对象,并防止内存泄漏。

这是一个 C++ 中智能指针的示例:

输出

5

说明

此代码将创建一个值为 5 的新整数对象,并将其地址存储在 unique_ptr 中。然后使用 unique_ptr 访问整数的值,该值将被打印到控制台。

由于 unique_ptr 管理它所指向的对象的生命周期,因此当 unique_ptr 在 main 函数结束时超出范围时,该整数对象将被自动删除。这有助于防止内存泄漏。

请注意,C++ 中有几种不同类型的智能指针,每种都有其特定的行为。unique_ptr 只是一个例子。其他常见的智能指针类型包括 shared_ptr 和 weak_ptr。

为什么 C 语言不支持智能指针?

智能指针是 C++ 的一项功能,而不是 C 语言的。在 C++ 中,智能指针是一种包装原始指针并管理原始指针所指向对象的生命周期的对象。智能指针在超出作用域时会自动删除它们指向的对象,这有助于防止内存泄漏。

为什么 C 语言没有 unique_ptr?

unique_ptr 不是 C 语言的一部分。unique_ptr 是一种智能指针,在 C++ 编程语言中可用。智能指针是一种对象,它的行为类似于普通指针,但还具有额外的功能,例如自动内存管理和边界检查。

unique_ptr 是一个拥有并管理其指向对象的智能指针。这意味着 unique_ptr 负责为其指向的对象分配和释放内存,并且它是唯一可以访问或修改该内存的对象。unique_ptr 提供了一种安全高效地管理动态分配内存的方法,通常用作 C++ 中原始指针的替代品。

C++ Unique_ptr

std::unique_ptr 是一种管理动态分配对象的生命周期的智能指针。它确保在 unique_ptr 超出作用域时正确删除该对象,并通过其 -> 和 * 运算符提供访问该对象的方式。

以下是如何创建和使用 unique_ptr 的示例。

示例 1

输出

5
6
false
6
7

说明

在此示例中,我们创建了一个名为 ptr1 的 unique_ptr,它指向值为 5 的动态分配的 int。我们使用 -> 和 * 运算符来访问和操作 ptr1 指向的对象。

接下来,我们使用 std::move 函数将对象的所有权转移给一个名为 ptr2 的新 unique_ptr。这意味着 ptr1 不再指向该对象。

示例-2

输出

ptr = 0x55d09d214eb0
*ptr = 10
ptr = 0x55d09d214eb0
*ptr = 20

示例-3

输出

MyClass constructed
MyClass destructed