详解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日

相关文章

  • windows下作为应用程序启动apache的方法

    作为应用程序启动 Apache 是在 Windows 系统下运行 Apache 服务器的一种方法,下面是完整的攻略: 第一步:下载并安装 Apache 首先,你需要从 Apache 官网下载适用于 Windows 系统的 Apache 服务器,下载地址为:https://httpd.apache.org/download.cgi 选择与你的 Windows …

    other 2023年6月25日
    00
  • 面试时必问的JVM运行时数据区详解

    面试时必问的JVM运行时数据区详解 在面试中,JVM(Java虚拟机)是一个常见的话题。了解JVM的运行时数据区是理解Java程序执行的关键。下面是对JVM运行时数据区的详细解释,包括两个示例说明。 1. 程序计数器(Program Counter Register) 程序计数器是JVM中的一块较小的内存区域。它的作用是指示当前线程执行的字节码指令的地址。在…

    other 2023年8月2日
    00
  • 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法

    对于未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序的错误,可以在以下情况下发生: 没有安装Microsoft Access Database Engine 2010 Redistributable。 项目使用32位或64位版本组件时,操作系统不符合要求。 如使用Visual Studio进行开发,则必须安装Microsoft…

    other 2023年6月25日
    00
  • 海量数据Excel报表利器——EasyExcel(开场篇)

    海量数据Excel报表利器——EasyExcel(开场篇) 本文将为您提供EasyExcel的完整攻略,包括EasyExcel的基本概念、使用方法、以及两个示例说明。 EasyExcel的基本概念 EasyExcel是一款基于Java的Excel操作工具,可以帮助开发者快速、高效地操作Excel文件。EasyExcel支持海量数据的读写,同时提供了丰富的AP…

    other 2023年5月6日
    00
  • MySQL数据库主从复制原理及作用分析

    MySQL数据库主从复制原理及作用分析 MySQL数据库主从复制是一种常见的数据库复制技术,用于实现数据的备份、读写分离和负载均衡。以下是一个完整的攻略,详细讲解MySQL数据库主从复制的原理及作用,并包含两个示例说明。 1. 主从复制原理 MySQL数据库主从复制基于二进制日志(Binary Log)实现。主服务器将写操作记录到二进制日志中,并将二进制日志…

    other 2023年10月19日
    00
  • 二个android模拟器互发短信程序演示

    二个android模拟器互发短信程序演示攻略 简介 本攻略将详细讲解如何使用两个Android模拟器互相发送短信的程序演示。这个演示可以帮助你了解Android模拟器之间的通信机制,并且可以用于测试和开发短信相关的应用程序。 步骤 安装Android模拟器 首先,你需要安装两个Android模拟器。你可以选择使用Android Studio自带的模拟器,或者…

    other 2023年9月5日
    00
  • Spring Boot优化后启动速度快到飞起技巧示例

    请听我讲解关于Spring Boot优化启动速度的攻略。为了提高Spring Boot的启动速度,我们可以采取以下技巧: 减少启动时的I/O操作 在Spring Boot应用启动过程中,会扫描并加载大量的类、属性配置文件等资源。而这些资源的读取都会产生I/O操作,从而影响启动速度。为了减少I/O操作,我们可以通过以下方式进行优化: 使用spring-boot…

    other 2023年6月20日
    00
  • ASP.NET 控件开发系列之图片切换web控件

    当开发ASP.NET网站时,我们常常需要实现图片切换效果。这时,我们可以使用ASP.NET控件开发系列之图片切换Web控件来方便地实现图片切换功能。下面是该控件的完整攻略: 控件的基本结构 控件的基类为 System.Web.UI.WebControls.WebControl,可以通过继承该类来创建自定义控件。 控件需要实现 System.Web.UI.IP…

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