C++ 中类的拷贝、赋值、销毁的实例详解

 更新时间:2020年4月25日 17:29  点击:1575

C++ 中类的拷贝、赋值、销毁的实例详解

本篇文章我们一共讲解一下几个知识点:

类的拷贝构造函数。

类的拷贝赋值运算符。

类的析构。

好了one by one

如果我们没有定义类的拷贝构造函数的话,那么编译器会为我们合成默认拷贝构造函数----合成拷贝构造函数。

和成拷贝构造函数的操作是将其参数的各个成员拷贝到正在创建的对象中去,每个成员的类型决定了他是如何被拷贝的:对类类型的成员,会使用其拷贝构造函数,内置类型的成员则是直接拷贝,虽然我们不能直接拷贝一个数组,但是合成拷贝构造函数会逐个的拷贝一个数组类型的成员。

下面我们用代码演示一下合成拷贝构造函数的功能:

#include <iostream> 
using namespace std; 
/* 
  代码模仿合成拷贝构造函数的功能 
*/ 
class Sales_data 
{ 
public: 
  Sales_data(); 
  //我们只是为了读者更好的理解还原了一下合成拷贝构造函数所实现的功能,实际上我们是看不见的 
  Sales_data(const Sales_data& s); 
  ~Sales_data(); 
 
private: 
  string bookNo; 
  int units_sold = 0; 
  double revenue = 0.0; 
 
}; 
 
Sales_data::Sales_data() 
{ 
} 
 
Sales_data::Sales_data(const Sales_data& s) : 
bookNo(s.bookNo), units_sold(s.units_sold), revenue(s.revenue){ 
   
} 
 
Sales_data::~Sales_data() 
{ 
} 

好了,我们定义拷贝构造函数也是如此定义的,我解释一下为什么参数表里面是一个静态的引用:

1)我们不想改变该引用的值,只是用来进行拷贝。

2)我们必须声明为引用,如果写成类的话,则又会调用该类的拷贝构造函数,在那个拷贝构造函数中又会调用拷贝构造函数,这样陷入死循环。

我们在来学习一下拷贝赋值运算符:

和拷贝构造函数一样,如果我们不定义拷贝赋值运算符的话,编译器将会为我们合成一个,我们下面用代码来模仿一下吧:

#include <iostream> 
using namespace std; 
/* 
代码模仿拷贝赋值运算符 
*/ 
class Sales_data 
{ 
public: 
  Sales_data(); 
  //拷贝赋值运算符的默认合成 
  Sales_data& operator = (const Sales_data & s); 
  ~Sales_data(); 
 
private: 
  string bookNo; 
  int units_sold = 0; 
  double revenue = 0.0; 
 
}; 
 
Sales_data::Sales_data() 
{ 
} 
 
Sales_data& Sales_data::operator = (const Sales_data & s) { //为什么我们的返回值一定是引用类型呢?这是因为我们可以进行链式编程而做的:s1 = s2 =s3; 
  bookNo = s.bookNo; 
  units_sold = s.units_sold; 
  revenue = s.revenue; 
  return *this; 
} 
 
Sales_data::~Sales_data() 
{ 
} 

好了,我们定义拷贝赋值运算符也是如此,我们就不一一赘述了。

我来在来谈一谈;类的构造函数初始化和类的析构函数销毁过程的一些细节性问题。

1比如我们定义了一个构造函数,实际上在参数化赋值列表处及大括号之前,才是我们真正进行初始化的地方,在大括号之中做的操作只是进行了拷贝赋值操作。

这一点我们要清楚的认识到,要不然在对const对象进行初始化是就有问题了,因为const对象只能初始化。

2比如我们定义了一个析构函数,注意了,我们在() {之间的部分才是做了真正的类成员变量的析构操作,{}里面使我们进行的自定义操作,不一定是什么析构,应为析构基本已经完成了。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

[!--infotagslink--]

相关文章

  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • c# 判断是否为空然后赋值的4种实现方法

    下面小编就为大家分享一篇c# 判断是否为空然后赋值的4种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • vue 数据(data)赋值问题的解决方案

    这篇文章主要介绍了vue 数据(data)赋值问题的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++如何删除map容器中指定值的元素详解

    map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25