C++对象的拷贝构造函数

        如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。
拷贝(复制)构造函数:利用同类对象构造一个新的对象
        ●1.函数名和类同名 (构造函数)
        ●2.没有返回值 (构造函数)
        ●3.第一个参数必须是类本身的对象的const 引用.可以有其它的参数,但其它参数必须有默认值,注意一般都只有一个参数.
        ●4.不能重载


class Foo
{
public:Foo();             //默认构造函数Foo(const Foo &f); //拷贝构造函数//...
};

        拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用,且这个参数几乎总是const的引用。其作用是使用一个已经存在的对象去初始化同类的一个新对象。如果我们不定义这个函数,系统会生成一个默认的拷贝构造函数,它的作用是从给定对象中依次将每个非static成员拷贝到正在创建的新对象中。

        如果类没有实现拷贝构造函数,它自动生成一个默认的拷贝构造函数,默认的完成分内的事情(1.为每个成员变量分配内存,2.每个成员变量赋值)

        拷贝构造函数的参数采用引用方式。如果是非引用,则调用永远也不会成功:为了调用拷贝构造函数,我们必须复制它的实参,但为了复制实参,我们又需要调用拷贝构造函数,如此无限循环。
        拷贝构造函数的特征。

        (1)拷贝构造函数的名字与类名相同,并且没有返回值。
        (2)拷贝构造函数只有一个参数,或者其它的参数都有默认值。
        (3)每个类都有一个拷贝构造函数。如果你没有定义拷贝构造函数,系统会自动生成拷贝构造函数。

调用拷贝构造函数的情况有以下几种。

●显式使用一个对象初始化另一个对象。
●对象作为函数实参传递给一个非引用类型的形参。(只在笔试面试中出现,实际编码要求传引用)
●返回类型为非引用类型的函数返回一个对象。

        例如:拷贝构造函数应用。
        设计一个复数类,两个数据成员分别表示复数的实部和虚部。定义两个构造函数,一个普通构造函数,一个拷贝构造函数。定义add函数完成两个复数的加法。


class Complex //复数类
{
public:Complex(double r, double i);Complex(const Complex& c);Complex add(Complex c);//加法
private:double real;    //实部double image;   //虚部
};
Complex::Complex(double r, double i) :real(r), image(i)
{cout << "构造函数,实部:"<<real<<",虚部:"<<image << endl;
}
Complex::Complex(const Complex & c)
{real = c.real;image = c.image;cout << "拷贝构造函数,实部:" << real << ",虚部:" << image << endl;
}Complex Complex::add(Complex c) 
{Complex y(real + c.real, image + c.image); //构造函数return y;//返回值为类对象,会调用拷贝构造函数
}
void f(Complex n) //参数是类对象,会调用拷贝构造函数
{cout << "f(Complex n)" << endl;
}
int main()
{Complex a(3, 4); //调用构造函数Complex b(6.5, 7.5);//调用构造函数Complex c(a); //拷贝构造函数Complex d = c;//拷贝构造函数,注意和下一节的赋值区分开f(b); //拷贝构造函数c = a.add(b); //拷贝构造函数return 0;
}

1.png

程序分析:
        1.第33,34行调用构造函数,创建了两个复数类对象a和b。输出第1,第2行
        2.第35行,Complex c(a),用一个已知对象初始化另一个对象,系统调用拷贝构造函数,输出第3行。
        3.第36行,Complex d = c;利用c初始化对象d,这一句看似=赋值,其实还是调用拷贝构造函数,因为这里还是初始化过程。这两种写法是等价的Complex d=c等同Complex d(c)等同Complex d{c},这种写法对于内置类型也是一样的,int a = 10等同int a(10)等同int a{10}。
        4.第38行,f(b),将实参b传给形参n,因为形参是非引用的类对象,调用拷贝构造函数。
        5.第39行,c=a.add(b),首先实参b传递给非引用形参c会调用拷贝构造函数,接着在add函数中定义了一个复数类对象y(24行),系统会调用构造函数。
        6.最后,函数add的返回值是一个非引用对象,系统会创建一个临时对象,将局部对象y赋值给临时对象,这时也要调用拷贝构造函数。

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

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

相关文章

软考中级-软件设计师(九)数据库技术基础 考点最精简

一、基本概念 1.1数据库与数据库系统 数据&#xff1a;是数据库中存储的基本对象&#xff0c;是描述事物的符号记录 数据库&#xff08;DataBase&#xff0c;DB&#xff09;&#xff1a;是长期存储在计算机内、有组织、可共享的大量数据集合 数据库系统&#xff08;DataBas…

MySQL环境搭建

MySQL 环境搭建 一、卸载不需要的MySQL环境 #1.关闭服务 systemctl stop mysql #2.查找MySQL安装包&#xff0c;并删除 rpm -qa&#xff1b;xargs yum remove -y 二、获取MySQL官方yum源 http://repo.mysql.com/ 根据系统版本下载对应的文件&#xff1b;然后使用rz将文件传…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数拷贝构造函数浅拷贝深拷贝拷贝构造函数实现 析构函数赋值重载 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 迭代器begin & endrbegin & rend 总结 前言 模拟实现不是为了写得和库里面一样好。而是为…

OmniReader Pro mac激活版:智慧阅读新选择,开启高效学习之旅

在追求知识的道路上&#xff0c;一款优秀的阅读工具是不可或缺的。OmniReader Pro作为智慧阅读的新选择&#xff0c;以其独特的功能和卓越的性能&#xff0c;为您开启高效学习之旅。 OmniReader Pro具备高效的文本识别和处理技术&#xff0c;能够快速准确地提取文档中的关键信息…

《QT实用小工具·五十四》果冻弹出效果的动画按钮

1、概述 源码放在文章末尾 该项目实现动画按钮&#xff0c;鼠标放在按钮上可以弹性拉出的三个按钮&#xff0c;使用贝塞尔曲线实现&#xff0c;项目demo显示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef WATERCIRCLEBUTTON_H #define WATERCIRCLEBUTTON…

Day 43 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

最后一块石头重量Ⅱ 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那么两…

Transformers中加载预训练模型的过程剖析

使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…

【go项目01_学习记录10】

操作数据库 1 插入数据2 显示文章2.1 修改 articlesShowHandler() 函数2.2 代码解析 3 编辑文章3.1 添加路由3.2 编辑articlesEditHandler()3.3 新建 edit 模板3.4 代码重构3.5 完善articlesUpdateHandler()3.6 测试更新3.7 封装表单验证 1 插入数据 . . . func articlesStore…

厚德提问大佬答4:AI绘画生成的心得

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

什么是async和await?

async 和 await 是 JavaScript&#xff08;特别是 ES2017 及更高版本&#xff09;中用于处理异步操作的关键字。它们使得异步代码看起来、写起来更像同步代码&#xff0c;从而提高了代码的可读性和可维护性。 async async 是一个函数修饰符&#xff0c;用于声明一个函数是异步…

车载电子电器架构 —— 应用软件开发(中)

车载电子电器架构 —— 应用软件开发(中) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

算法设计课第五周(贪心法实现活动选择问题)

目录 一、【实验目的】 二、【实验内容】 三、实验源代码 一、【实验目的】 &#xff08;1&#xff09;熟悉贪心法的设计思想 &#xff08;2&#xff09;理解贪心法的最优解与正确性证明之间的关系 &#xff08;3&#xff09;比较活动选择的各种“贪心”策略&#xff0c;…

安卓手机APP开发__设备兼容性概述

安卓手机APP开发__设备兼容性概述 目录 概述 兼容性意味着什么? 控制你的APP对设备的可用性 设备特性 平台版本 屏幕配置

基于AI的Python爬虫-Scrapegraph-ai

网址 https://github.com/VinciGit00/Scrapegraph-ai 刚从github榜单看到的&#xff0c;将ai和爬虫结合起来的项目&#xff0c;我没安装&#xff0c;凡是关于ai的要么自己下载模型&#xff0c;要么用在线的api&#xff0c;这两样我现在都懒得装。 看介绍的话可以根据自然语言…

动态IP避坑指南:如何挑选合适的动态代理IP?

在如今的网络环境中&#xff0c;使用动态IP代理成为实现隐私保护、访问受限内容和提高网络效率的一种常见方式&#xff0c;选择合适的国外动态IP代理可以让我们的业务处理事半功倍。面对市面上琳琅满目的选择&#xff0c;如何挑选购买适合自己的动态IP代理服务呢&#xff1f;在…

pragma omp parallel for与pragma omp critical理解

pragma omp parallel for #pragma omp parallel for是OpenMP API中的一个编译器指令&#xff0c;用于在C/C程序中实现并行计算。这个指令告诉编译器下面的for循环应该被并行执行&#xff0c;即循环的迭代被分配到多个线程中&#xff0c;以便同时执行。这样做的目的是为了利用现…

【数据结构】手把手带你玩转线性表

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

弱监督语义分割-对CAM的生成过程进行改进1

一、仿射变换图像结合正则项优化CAM生成 论文&#xff1a;Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation &#xff08;CVPR,2020&#xff09; 1.SEAM方法 孪生网络架构&#xff08;Siamese Network Architecture&#xff09…

2024.5.10

TCP服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口大小和窗口大小固定this->resize(727,879);this->setFixedSize(727,879);//创建…

2024- 人工智能药物设计- AIDD- 胶质母细胞瘤的相关论文研究

胶质母细胞瘤的相关论文研究 1. 胶质母细胞瘤的相关的论文 Natural Small Molecules Targeting NF-κB Signaling in Glioblastoma: This review discusses the role of NF-κB signaling in glioblastoma and highlights natural small molecules that can interfere with t…