详解C++-(=)赋值操作符、智能指针编写

详解C++-(=)赋值操作符、智能指针编写

1. (=)赋值操作符

C++中,(=)是一种赋值操作符。它允许我们将一个值赋值给一个变量。在C++中,(=)是右结合的,也就是说,赋值语句的右边的操作数先被计算。

例如,我们有一个类Person,它有一个name字符串和一个age整数:

class Person {
  string name_;
  int age_;
public:
  Person(string name, int age);
  // other constructors, destructors and methods
};

我们可以使用赋值操作符将一个Person对象的值赋给另一个Person对象:

Person p1("Alice", 25);
Person p2 = p1;

在这里,我们将p1的值赋给了p2。这意味着p1p2现在具有相同的nameage值。但是需要注意的是,这并不意味着p1p2指向同一个对象。它们仍然是两个独立的对象,只是它们的值相同而已。

除了一般的数据类型之外,我们还可以使用赋值操作符来操作复合对象,例如数组和结构体。

2. 智能指针编写

智能指针是一种帮助我们管理动态内存分配的数据结构。它们在C++中特别有用,因为它们可以帮助我们减少内存泄漏和指针错误。

C++11中引入了两种类型的智能指针:unique_ptrshared_ptr

2.1 unique_ptr

unique_ptr是一种独占所有权的智能指针。这意味着,一个unique_ptr指针可以拥有一个对象的唯一所有权,并且不能与其他unique_ptr共享。

#include <iostream>
#include <memory>

int main() {
    std::unique_ptr<int> p1(new int(5));
    std::unique_ptr<int> p2;
    p2 = std::move(p1);

    std::cout << *p2 << std::endl; // 输出5

    return 0;
}

在这个例子中,我们创建了两个unique_ptr对象p1p2,其中p1拥有一个新的int对象。然后,我们将p1的所有权转移给了p2,所以现在p2是唯一拥有int对象的unique_ptr

2.2 shared_ptr

shared_ptr是一种允许多个指针共享同一个对象的智能指针。当一个shared_ptr被销毁,只有在没有任何其他shared_ptr指向该对象时,才会释放该对象。

#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> p1(new int(5));
    std::shared_ptr<int> p2 = p1;

    std::cout << *p1 << std::endl; // 输出5
    std::cout << *p2 << std::endl; // 输出5

    return 0;
}

在这个例子中,我们创建了两个shared_ptr对象p1p2,它们都指向一个新创建的int对象。由于p1p2公用这个对象,因此该对象的内存只有在它们都销毁后才会被释放。

3. 示例说明

3.1 (=)赋值操作符示例

#include <iostream>
#include <string>

using namespace std;

class Person {
  string name_;
  int age_;
public:
  Person(string name, int age) : name_{name}, age_{age} {}
  Person& operator=(const Person& p) {
      if (this != &p) {
          name_ = p.name_;
          age_ = p.age_;
      }
      return *this;
  }
  friend ostream& operator<<(ostream& os, const Person& p) {
      os << "Name: " << p.name_ << ", Age: " << p.age_;
      return os;
  }
};

int main() {
    Person p1("Alice", 25);
    Person p2("Bob", 30);

    cout << "p1: " << p1 << endl;
    cout << "p2: " << p2 << endl;

    p2 = p1;
    cout << "After assignment: " << endl;
    cout << "p1: " << p1 << endl;
    cout << "p2: " << p2 << endl;

    return 0;
}

在这个示例中,我们定义了一个Person类,并在类中重载了(=)赋值操作符。在main函数中,我们创建了两个Person对象p1p2,然后将p1的值赋给p2,输出两个对象的值。

3.2 shared_ptr示例

#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> p1(new int(5));
    std::shared_ptr<int> p2 = p1;

    std::cout << "p1.use_count(): " << p1.use_count() << std::endl;
    std::cout << "p2.use_count(): " << p2.use_count() << std::endl;

    p2.reset();

    std::cout << "After resetting p2: " << std::endl;
    std::cout << "p1.use_count(): " << p1.use_count() << std::endl;
    std::cout << "p2.use_count(): " << p2.use_count() << std::endl;

    return 0;
}

在这个示例中,我们创建了两个shared_ptr对象p1p2,并将它们都指向一个新创建的int对象。然后我们输出每个指针的引用计数。

接下来,我们使用reset()函数将p2重置为空指针。在输出引用计数之后,可以看到p2的引用计数变为了0,而p1的引用计数仍然是1,因为它仍然指向该int对象。

这个示例说明了shared_ptr的共享所有权和引用计数机制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++-(=)赋值操作符、智能指针编写 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • AAM(Active Appearance Model)算法介绍

    AAM(Active Appearance Model)算法介绍 什么是AAM算法 AAM(Active Appearance Model)算法是一种基于统计形状模型的人脸识别算法,它可以对人脸进行建模,并通过对模型的训练和优化,实现对人脸的识别和跟踪。 AAM算法的基本思想是将人脸分为形状和纹理两个部分,通过对形状和纹理的建模,实现对人脸的识别和跟踪。形状…

    other 2023年5月5日
    00
  • 驱动精灵Realtek音频驱动更新重启一次便可完成

    下面是关于“驱动精灵Realtek音频驱动更新重启一次便可完成”的完整攻略: 1. 下载驱动精灵并安装 首先需要下载一支电脑驱动更新工具,这里推荐驱动精灵,它可以自动扫描并更新电脑驱动,非常方便。安装驱动精灵的过程比较简单,你可以在官网下载安装程序,然后按照提示进行安装即可。 2. 扫描并更新Realtek音频驱动 安装好驱动精灵之后,打开它,选择“驱动更新…

    other 2023年6月27日
    00
  • 详解用JS添加和删除class类名

    关于详解用JS添加和删除class类名的完整攻略,我来给您详细讲解一下。 添加class类名 使用classList属性 为一个元素添加class类名,可以使用该元素的classList属性,并调用其add()方法。 下面是一个添加class类名的示例: <div id="myDiv">Hello World!</div…

    other 2023年6月27日
    00
  • ASP.NET MVC从控制器传递数据到视图的四种方式详解

    下面开始详细讲解“ASP.NET MVC从控制器传递数据到视图的四种方式详解”攻略。 一、使用ViewBag 在ASP.NET MVC中,可以通过ViewBag将数据从控制器传递到视图。 首先,在控制器中定义一个变量,然后将其赋值给ViewBag即可: public ActionResult Index() { ViewBag.Title = "W…

    other 2023年6月27日
    00
  • C# 开发圆角控件(窗体)的具体实现

    下面我将为你详细讲解“C# 开发圆角控件(窗体)的具体实现”的完整攻略,包含以下步骤: 步骤一:创建自定义控件类 在 Visual Studio 中,创建一个新 Windows 控制台应用程序,命名为“RoundedForm”。点击“解决方案资源管理器”中的项目根节点,在上下文菜单中选择“添加 → 新项”,选择“类”模板,并命名为“RoundedForm.c…

    other 2023年6月26日
    00
  • Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

    下面是Java实现的二叉树常用操作的完整攻略: 前置知识 在学习本攻略之前,需要掌握以下基础知识: Java的基本语法以及面向对象编程的理解 二叉树的定义与性质 二叉树的定义 二叉树是一种树状结构,其中每个节点最多有两个子节点。二叉树的定义如下: class TreeNode { int val; TreeNode left; TreeNode right;…

    other 2023年6月27日
    00
  • DR.COM宽带认证客户端安装教程

    DR.COM宽带认证客户端安装教程 一、前言 DR.COM是一家提供网络认证服务的公司,它的宽带认证客户端是一个Windows系统下的软件,用于校园网、公共WIFI等场所认证登陆使用。本篇教程主要介绍DR.COM宽带认证客户端的安装过程。 二、安装步骤 在DR.COM官网下载客户端安装程序,安装程序的名称为DRComClient.exe。下载链接为:http…

    other 2023年6月25日
    00
  • Win11移动硬盘不显示怎么办?移动硬盘在电脑上显示不出来解决方法

    当移动硬盘在Win11电脑上插入后无法显示时,可以使用以下操作进行解决。 1. 检查移动硬盘连接 首先需要检查移动硬盘是否正确连接到电脑上。如果连接不良,可能导致电脑无法识别移动硬盘。 检查USB接口是否损坏或者松动,重插移动硬盘; 尝试使用其他USB接口连接移动硬盘; 检查移动硬盘是否供电正常。 2. 打开磁盘管理 如果移动硬盘仍然无法显示,可以尝试在Wi…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部