拷贝(复制)构造函数定义及3种调用情况举例

article/2024/12/5 7:54:33

一、拷贝构造函数是一种特殊的构造函数,其形参为本类的对 象引用。

class 类名 

{ public : 类名(形参);//构造函数

                类名(类名 &对象名);//拷贝构造函数 ... 
};

//拷贝构造函数 ... 

类名::类(类名 &对象名)//拷贝构造函数的实现

{ 函数体 }

如:

Box∷Box(const Box& b)

{

height=b.height;

width=b.width;

length=b.length;

}

复制构造函数也是构造函数,但它只有一个参数,这个参数是本类 的对象(不能是其他类的对象),而且采用对象的引用的形式(一般约定 加const声明,使参数值不能改变,以免在调用此函数时因不慎而使对 象值被修改)。 如果用户自己未定义复制构造函数,则编译系统会自动提供一个默认的 复制构造函数,其作用只是简单地复制类中每个数据成员。

二、请注意普通构造函数和复制构造函数的区别

(1) 在形式上

类名(形参表列); //普通构造函数的声明,如Box(int h,int ,int en);

类名(类名& 对象名); //复制构造函数的声明,如Box(Box &b);

(2) 在建立对象时,实参类型不同

系统会根据实参的类型决定调用普通构造函数或复制构造函数。

如 Box box1(12,15,16); //实参为整数,调用普通构造函数

Box box2(box1); //实参是对象名,调用复制构造函数

(3) 在什么情况下被调用

普通构造函数在程序中建立对象时被调用。 复制构造函数在用已有对象复制一个新对象时被调用,在以下3 种情况下需要克隆对象:

① 程序中需要新建立一个对象,并用另一个同类的对象对它初始化:

box2=box1//box2(box1)

② 当函数的参数为类的对象时。在调用函数时需要将实参对象 完整地传递给形参,也就是需要建立一个实参的拷贝,这 就是按实参复制一个形参,系统是通过调用复制构造函数 来实现的,这样能保证形参具有和实参完全相同的值。如

void fun(Box b) //形参是类的对象

{  }

int main( )

{Box box1(12,15,18);

fun(box1); //实参是类的对象,调用函数时将复制一个新对象b

return 0;

}

③ 函数的返回值是类的对象。 在函数调用完毕将返回值带回函数调用处时。此时需要将函数中的对象 复制一个临时对象并传给该函数的调用处。如:

Box f( ) //函数f的类型为Box类类型

{ Box box1(12,15,18);

return box1; //返回值是Box类的对象

}

int main( )

{Box box2; //定义Box类的对象box2

box2=f( ); //调用f函数,返回Box类的临时对象,并将它赋值给box2

}

以上几种调用复制构造函数都是由编译系统自动实现的,不必由用户自 己去调用,只要知道在这些情况下需要调用复制构造函数就可以了。

三、调用拷贝构造函数的例子(Point类为例)

#include "iostream"
using namespace std;//定义一个Point类
class Point{
public:Point(int xx=0,int yy=0):x(xx),y(yy){}     //构造函数~Point(){ };                              //析构函数Point(const Point &p);                //复制构造函数int getX()const{return x;}int getY()const {return y;}
private:int x,y;//私有成员};Point::Point(const Point &p)
{x = p.x;y = p.y;cout << "Calling the copy constructor" <<endl;}
//形参作为Point类对象的函数
void fun1(Point p)
{cout<< p.getX()<<endl;}//返回类的对象
Point fun2()
{Point a(1,2);return a;
}int main()
{Point a(4);    //第一个对象A,该过程利用了重载,后面的y默认为0Point b(a);      //此时调用copy构造函数;情况1,用a初始化b,第一次调用copy构造函数cout << b.getX()<<endl; fun1(b);  //此时调用copy构造函数;类的对象在函数中为实参,第二次调用copy构造函数b = fun2();//此时调用copy构造函数;函数返回值为类的对象,第三次调用copy构造函数cout << b.getX()<<endl; return 0;
}

运行结果如下:

 


http://chatgpt.dhexx.cn/article/oJdAbSgr.shtml

相关文章

C++——拷贝构造函数详解

C——拷贝构造函数详解 1.拷贝构造函数的特点&#xff1a;2.通过例子引入拷贝构造&#xff1a;3构造对象的时候使用引用返回与不使用引用返回的问题&#xff1a;3.1不使用引用返回&#xff1a;3.2引用返回——从已经死亡的地址接收值不牢靠&#xff1a; 4.缺省的拷贝构造和等号…

C++ 拷贝构造函数详解

C 拷贝构造函数详解 下面的讲解将以C标准库的string类作为讲解对象&#xff0c;string类&#xff1a;class with pointer member(s) 1、拷贝构造函数和拷贝赋值函数 1.1引入 下面是给出的测试函数&#xff0c;也是我们要能在自己设计的myString类中实现的功能&#xff1a; …

详解析构函数、拷贝构造函数

目录 一.析构函数&#xff08;析构器&#xff09; &#xff08;一&#xff09;.使用方式及注意事项 1.使用方式 2.注意事项 &#xff08;二&#xff09;.默认析构函数 二.拷贝构造函数 &#xff08;一&#xff09;.使用方式及注意事项 1.使用方式 2.注意事项 &#xff0…

【深入理解C++】拷贝构造函数

文章目录 1.拷贝构造函数2.默认的拷贝操作3.默认拷贝构造函数4.何时调用拷贝构造函数 1.拷贝构造函数 拷贝构造函数是构造函数的一种。当利用已存在的对象创建一个新对象时&#xff0c;就会调用新对象的拷贝构造函数进行初始化。 拷贝构造函数的格式是固定的&#xff0c;即接…

C++拷贝构造函数详解

一. 什么是拷贝构造函数 首先对于普通类型的对象来说&#xff0c;它们之间的复制是很简单的&#xff0c;例如&#xff1a; int a 100; int b a; 而类对象与普通对象不同&#xff0c;类对象内部结构一般较为复杂&#xff0c;存在各种成员变量。 下面看一个类对象拷贝的简…

c++拷贝构造函数(深拷贝,浅拷贝)详解

一、什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象拷贝的简单例子。 #include<iostream> using n…

YOLO 裂缝检测

环境 python3.5 yolov3 opencv keras

基于OpenCV的混凝土裂纹检测

基于OpenCV的混凝土裂纹检测 前言 这是我发的第一次博客&#xff0c;有什么建议大家可以给我留言&#xff0c;感激不尽! 接下来&#xff0c;我们进入正题。 一、使用函数库 numpy, opencv, heapq, skimage.morphology 二、使用步骤 1.初步预处理 初步预处理包括&#xf…

【图像识别】基于计算机视觉实现路面裂缝检测识别系统matlab代码

1 简介 随着公路与铁路事业的飞速发展,各类车辆和里程的增加,铁路的一次次提速,都对路面产生了巨大的压力。不论是公路路面还是铁路路面,路面裂纹都能随处可见,由路面裂纹造成的交通事故时有发生。研究路面裂纹检测方法对于路面维护、交通安全具有极其重大意义。近年来,路面裂…

基于计算机视觉的裂纹检测方案

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达01. 数据集 我们首先需要从互联网上获取包含墙壁裂缝的图像&#xff08;URL格式&#xff09;数据。总共包含1428张图像&#xff1a;其中一半是新的且未损坏的墙壁&#x…

halcon裂纹缺陷检测

针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成&#xff0c;因为背景的纹理不可能和当前图像的纹理完全相同。 方法一—局部阈值分割 一、局部阈值分割 1、gen_sin_bandpass–局部阈值分割 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset,…

使用 Python 进行深度学习以进行裂纹检测

使用 Python 进行深度学习以进行裂纹检测 问题陈述数据集准备训练模型结论参考 问题陈述 虽然新技术已经改变了我们生活的方方面面&#xff0c;在建筑领域似乎牛逼正在努力追赶。目前&#xff0c;建筑物的结构状况仍然主要是人工检查。简单来说&#xff0c;即使现在需要检查结…

Halcon-表面检测-----裂纹检测

对应示例程序&#xff1a; detect_mura_defects_blur.hdev 目标&#xff1a;实例实现LCD上有很多污点干扰下&#xff0c;检测LCD的印痕检测。 思路为&#xff1a;对LCD图像进行拆分&#xff0c;提取RGB三个分量。 对B分量进行处理&#xff0c;将其转换为频域内图像&#xff0…

图像中的裂纹检测

01. 数据集 我们首先需要从互联网上获取包含墙壁裂缝的图像(URL格式)数据。总共包含1428张图像:其中一半是新的且未损坏的墙壁;其余部分显示了各种尺寸和类型的裂缝。 第一步:读取图像,并调整大小。 images = []for url in tqdm.tqdm(df[content]): response = req…

html图片与文字轮播,我是这样写文字轮播的

原标题&#xff1a;我是这样写文字轮播的 作者&#xff1a;一半水一半冰 原文&#xff1a;http://www.cnblogs.com/jingh/p/6377736.html 1写在前面 最近总结下之前的工作&#xff0c;才恍然发现时间的流逝永远是悄无声息的&#xff0c;离开学校那座象牙塔已经也有大半年的时间…

IOS 文本文字下面添加下划线

2019独角兽企业重金招聘Python工程师标准>>> UILabel *infolabel [[UILabel alloc] initWithFrame:CGRectMake(30*RATIO,260*RATIO, self.view.bounds.size.width-60*RATIO, 20*RATIO)];infolabel.text "infoimcba.com";infolabel.textColor [UIColor …

html语言 特效字,用HTML和CSS实现酷炫的文字特效

前言 马上我们就要进入下一个阶段&#xff0c;也就是HTML和CSS实现前端界面的阶段了&#xff0c;想必很多小伙伴都想给自己的页面加点酷炫的特效&#xff0c;今天&#xff0c;我就给大家整理了一些非常酷炫的文字特效来装点你的页面&#xff01;有些是从网络上找的&#xff0c;…

python抓取图片数字_python 实现识别图片上的数字

Python 3.6 版本 Pytesseract 图像验证码识别 环境: (1) win7 64位 (2) Idea (3) python 3.6 (4) pip install pillow <&nbsp>pip install pytesseract (5) 识别引擎tesseract-ocr 安装 安装tesseract-ocr的识别引擎 第一步:下载安装包 我下载的是64位,根据自…

html改变字母间距,css怎么调整字体间距?

在前端开发的过程中&#xff0c;有时候可能会出现字与字之间比较紧凑&#xff0c;我们可以通过css设置文字间隔让字与字之间的距离大一点&#xff0c;下面我们来看一下如何使用css调整字体间距。 css中解决字与字间隔的方法是使用css样式属性letter-spacing&#xff0c;letter-…

html ul 加点,HTML ul compact 属性 | 菜鸟教程

HTML compact 属性 实例 在无序列表中使用compact属性&#xff1a; CoffeeTeaMilk 尝试一下 浏览器支持 所有主流浏览器都不支持 compact 属性。 定义和用法 HTML5 不支持 compact 属性。 请使用 CSS 替代。 的 compact 属性在 HTML 4.01 已废弃。 compact 属性是一个 boole…