拷贝构造函数和赋值函数

1、拷贝构造函数:用一个已经有的对象构造一个新的对象。

CA(const CA & c )函数的名称必须和类名称相一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const 类型,不可变。

   拷贝构造函数什么时候被用到?

(1)当用一个已初始化过的自定义类型对象去初始化另一个新构造的对象的时候。

(2)一个对象以值传递的方式传入。在调用函数时需要将实参对象完整的传递给形参,系统是通过调用拷贝构造函数来实现的,这样能保证形具有和实参完全相同的值。

(3)一个对象以值传递的方式传出函数体。在函数调用完毕将返回值带回函数调用处。此时需要将函数中的对象拷贝到一个临时对象处并传给该函数的调用处。

 拷贝构造函数为什么传引用而不传值?

如果拷贝构造函数进行值传递的话,那么形参会产生一个新对象,也就是会调用拷贝构造函数,因此会形成一个死循环。

调用拷贝构造函数需要先创建形参对象,创建形参对象又需要调用拷贝构造函数,无限递归肯定是不正确的,所以在这里要用引用而不是值传递。

 

2、赋值运算符的重载函数:用一个已经有的对象给一个同一类型的对象赋值。(两个对象都存在)

CA & operator = (const  CA & )

返回值的对象为引用是为了可以连续赋值

赋值函数中可以既可以使用引用也可以使用值传递,不过值传递会多生成一个对象,造成资源的浪费。

class A
{
private:
 int a;
 int b;
public:
 A (const A & arg) // 拷贝构造函数  
 {
  a = arg.a;
  b = arg.b;
 }
 A & operator = ( const A & arg) //重载的赋值函数 
 {
  if(this != &arg)// 先判断下是否是自身赋值
  {
   a = arg.a;
   b = arg.b;
  }
  return *this;
 }
};

当类中含有指针成员时,两者的意义有很大区别

复制构造函数需为指针变量分配内存空间,并将实参的值拷贝到其中;而赋值操作符它实现的功能仅仅是将‘=’号右边的值拷贝至左值,在左边对象内存不足时,

先释放然后再申请。当然赋值操作符必须检测是否是自身赋值,若是则直接返回当前对象的引用而不进行赋值操作。

拷贝构造函数分为两类:

一类是系统默认提供的拷贝构造函数,只是简单的把栈里面的数据进行拷贝,堆上面的内容没有进行拷贝。
二类是自己定义的拷贝构造函数,能够对堆上面的东西进行深度的拷贝。
这里又要提到深拷贝和浅拷贝的问题。
浅拷贝

深拷贝

class Student
{
private:
 char *name;
public:
 Student (const Student & arg)
 {
  int length = strlen(arg.name)+1;
  this->name = new char[length];   // 深拷贝,先在堆上分配内存,再拷贝内容。
  strncpy(this->name,arg.name,length);
 }
 Student & operator=( const Student &arg)
 {
  if(this != &arg)
  {
   delete []name;// 先销毁之前分配的堆上的内存
  }
  int length = strlen(arg.name)+1;
  this->name = new char[length];// 重新分配,并拷贝。
  strncpy(this->name,arg.name,length);
  return *this;
 }
};

 

转载于:https://www.cnblogs.com/97-5-1/p/8673326.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chrome keyboard shortcuts

2019独角兽企业重金招聘Python工程师标准>>> Chrome keyboard shortcuts https://support.google.com/chrome/answer/157179?hlen 转载于:https://my.oschina.net/qwfys200/blog/1927456

数据中心细节_当细节很重要时数据不平衡

数据中心细节定义不平衡数据 (Definition Imbalanced Data) When we speak of imbalanced data, what we mean is that at least one class is underrepresented. For example, when considering the problem of building a classifier, let’s call it the Idealisstic-Voter.…

辛普森悖论_所谓的辛普森悖论

辛普森悖论We all know the Simpsons family from Disneyland, but have you heard about the Simpson’s Paradox from statistic theory? This article will illustrate the definition of Simpson’s Paradox with an example, and show you how can it harm your statisti…

查看NVIDIA使用率工具目录

2019独角兽企业重金招聘Python工程师标准>>> C:\Program Files\NVIDIA Corporation\Display.NvContainer\NVDisplay.Container.exe 转载于:https://my.oschina.net/u/2430809/blog/1927560

余弦相似度和欧氏距离_欧氏距离和余弦相似度

余弦相似度和欧氏距离Photo by Markus Winkler on UnsplashMarkus Winkler在Unsplash上拍摄的照片 This is a quick and straight to the point introduction to Euclidean distance and cosine similarity with a focus on NLP.这是对欧氏距离和余弦相似度的快速而直接的介绍&…

七、 面向对象(二)

匿名类对象 创建的类的对象是匿名的。当我们只需要一次调用类的对象时,我们就可以考虑使用匿名的方式创建类的对象。特点是创建的匿名类的对象只能够调用一次! package day007;//圆的面积 class circle {double radius;public double getArea() {// TODO…

机器学习 客户流失_通过机器学习预测流失

机器学习 客户流失介绍 (Introduction) This article is part of a project for Udacity “Become a Data Scientist Nano Degree”. The Jupyter Notebook with the code for this project can be downloaded from GitHub.本文是Udacity“成为数据科学家纳米学位”项目的一部分…

Qt中的坐标系统

转载:原野追逐 Qt使用统一的坐标系统来定位窗口部件的位置和大小。 以屏幕的左上角为原点即(0, 0)点,从左向右为x轴正向,从上向下为y轴正向,这整个屏幕的坐标系统就用来定位顶层窗口; 此外,窗口内部也有自己…

预测股票价格 模型_建立有马模型来预测股票价格

预测股票价格 模型前言 (Preface) If you are reading this, it’s most likely because you love to solve puzzles. I’m a very competitive person by nature. The Mt. Everest of puzzles, in my opinion, is trying to find excess returns through active trading in th…

Python 模块 timedatetime

time & datetime 模块 在平常的代码中,我们常常需要与时间打交道。在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍。 在开始之前,首先要说明几…

柠檬工会_工会经营者

柠檬工会Hey guys! This week we’ll be going over some ways to work with result sets in MySQL. These result sets are the outputs of your everyday queries, such as:大家好! 本周,我们将介绍一些在MySQL中处理结果集的方法。 这些结果集是您日常…

写给Java开发者看的JavaScript对象机制

帮助面向对象开发者理解关于JavaScript对象机制 本文是以一个熟悉OO语言的开发者视角,来解释JavaScript中的对象。 对于不了解JavaScript 语言,尤其是习惯了OO语言的开发者来说,由于语法上些许的相似会让人产生心理预期,JavaScrip…

大数据ab 测试_在真实数据上进行AB测试应用程序

大数据ab 测试Hello Everyone!大家好! I am back with another article about Data Science. In this article, I will write about what is A-B testing and how to use it on real life data-set to compare two advertisement methods.我回来了另一篇有关数据科…

node:爬虫爬取网页图片

前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片,自己就想着作为一个码农,可以把这些图片都爬取下来做成一个微信小程序,说干…

如何更好的掌握一个知识点_如何成为一个更好的讲故事的人3个关键点

如何更好的掌握一个知识点You’re launching a digital transformation initiative in the middle of the ongoing pandemic. You are pretty excited about this big-ticket investment, which has the potential to solve remote-work challenges that your organization fac…

centos 搭建jenkins+git+maven

gitmavenjenkins持续集成搭建发布人:[李源] 2017-12-08 04:33:37 一、搭建说明 系统:centos 6.5 jdk:1.8.0_144 jenkins:jenkins-2.93-1.1 git:git-2.9.0 maven:Maven 3.3.9 二、部署 2.1、jdk安装 1)下…

什么事数据科学_如果您想进入数据科学,则必须知道的7件事

什么事数据科学No way. No freaking way to enter data science any time soon…That is exactly what I thought a year back.没门。 很快就不会出现进入数据科学的怪异方式 ……这正是我一年前的想法。 A little bit about my data science story: I am a complete beginner…

Java基础-基本数据类型

Java中常见的转义字符: 某些字符前面加上\代表了一些特殊含义: \r :return 表示把光标定位到本行行首. \n :next 表示把光标定位到下一行同样的位置. 单独使用在某些平台上会产生不同的效果.通常这两个一起使用,即:\r\n. 表示换行. \t :tab键,长度上相当于四个或者是八个空格 …

季节性时间序列数据分析_如何指导时间序列数据的探索性数据分析

季节性时间序列数据分析为什么要进行探索性数据分析? (Why Exploratory Data Analysis?) You might have heard that before proceeding with a machine learning problem it is good to do en end-to-end analysis of the data by carrying a proper exploratory …

TortoiseGit上传项目到GitHub

1. 简介 gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。 2. 准备 2.1 安装git:https://git-scm.com/downloads。无脑安装 2.2 安装TortoiseGit(小乌龟):https://torto…