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

相关文章

  • mybatis使用collection嵌套查询的实现

    MyBatis使用Collection嵌套查询的实现攻略 在MyBatis中,我们可以使用Collection嵌套查询来处理复杂的数据关联关系。这种技术可以帮助我们在查询结果中嵌套加载关联的集合数据,从而避免了多次查询数据库的开销。下面是使用Collection嵌套查询的实现攻略。 步骤一:定义数据模型 首先,我们需要定义相关的数据模型。假设我们有两个实体类…

    other 2023年7月28日
    00
  • Swift中定义单例的方法实例

    当我们需要在Swift中创建一个单例(Singleton)时,可以使用以下方法: 方法一:使用静态常量 class Singleton { static let shared = Singleton() private init() { // 初始化代码 } // 其他方法和属性 } 在这个示例中,我们创建了一个名为Singleton的类,并定义了一个静态常…

    other 2023年7月29日
    00
  • redis设置永不过期

    Redis设置永不过期 Redis是一种常见的内存数据库,它支持键值存储、持久化、发布订阅等多种功能。在Redis中,数据的存储会有一个过期时间,一旦过期就会被删除。但是,在某些场景中,我们需要将某些数据设置为永不过期,让它们一直留在Redis中,这时我们可以采取以下方法实现。 方法一:设置过期时间为极大值 Redis中可以使用EXPIRE命令设置键的过期时…

    其他 2023年3月28日
    00
  • C++中构造函数的参数缺省的详解

    C++中构造函数的参数缺省的详解 在C++中,我们可以为构造函数设置参数缺省值,使得在实例化对象时可以省略某些参数,也可以在某些场合给构造函数更灵活的设置。 构造函数参数缺省的语法格式 为构造函数设置参数缺省值的语法格式如下: class 类名{ public: 类名(参数列表 = 缺省值); … }; 构造函数的参数列表可以设置一个或多个缺省值,缺省值…

    other 2023年6月26日
    00
  • Excel2016打开文档时提示内存或磁盘空间不足的两种解决方法

    Excel2016打开文档时提示内存或磁盘空间不足的两种解决方法 当使用Excel 2016打开文档时,有时会遇到内存或磁盘空间不足的提示。这可能是由于文档过大或计算机资源不足所导致的。下面是两种解决方法,可以帮助您解决这个问题。 方法一:增加内存或磁盘空间 增加内存:如果您的计算机内存不足,可以考虑增加内存以提高性能。以下是一些示例说明: 示例1:升级内存…

    other 2023年8月1日
    00
  • 解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题

    当我们在使用Vue开发一个单页面应用(Single Page Application)的时候,会使用到Vue CLI打包工具来将我们的项目打包成静态文件。但是,有时候我们在打开打包完后的index.html文件时,会遇到页面空白以及图片路径错误的问题。下面我将详细讲解如何解决这个问题。 问题原因 Vue打包后生成的静态文件是以相对路径的形式来引入图片等资源文…

    other 2023年6月27日
    00
  • 解决使用mybatis-plus时,生成的SQL大写变小写加下划线问题

    解决使用mybatis-plus时,生成的SQL大写变小写加下划线问题攻略 在使用mybatis-plus时,有时会遇到生成的SQL语句中,原本应该是大写的部分变成了小写,并且还加上了下划线的问题。下面是解决这个问题的完整攻略。 步骤一:检查数据库配置 首先,我们需要检查数据库配置,确保数据库的字符集设置为utf8mb4或utf8。这是因为在某些情况下,如果…

    other 2023年8月18日
    00
  • Excel怎么制作带有多个Excel图表控件的动态图表?

    制作带有多个Excel图表控件的动态图表,可以通过以下步骤实现: 1. 前期准备 首先,需要准备好数据源。在Excel中创建一个包含多个数据系列的数据表格,确保每一列的数据可以映射到不同的图表控件上。 2. 创建图表控件 在Excel中,选择“插入”选项卡,在“图表”组中选择需要的图表类型,然后插入一个新的图表。此时,Excel会自动创建一个空白图表,并在工…

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