中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第二周 类和类的对象基础 笔记 之 复制构造函数

2023-11-08

第二周 类和类的对象基础
1.类和对象的基本概念(2)
2.构造函数
3.复制构造函数
4.类型转换构造函数和析构函数
5.构造函数析构函数调用时机

3.复制构造函数

用一个同类的已存在对象,复制它,来初始化一个新的对象。
只有一个参数,即对同类对象的引用,形如 X::X( X& )或X::X(const X &), 二者选一,后者能以常量对象作为参数,比较好用,可以防止意外改变另一个对象。
一个类一定会有复制构造函数,如果没有定义复制构造函数,那么编译器生成默认复制构造函数。默认的复制构造函数完成复制功能。

//自己不定义复制构造函数,编译器自动生成
class Complex {
	private :
	double real,imag;
};
Complex c1; //调用缺省无参构造函数
Complex c2(c1);//调用缺省的复制构造函数,将 c2 初始化成和c1一样

//定义的自己的复制构造函数,则默认的复制构造函数不存在。
class Complex {
	public :
		double real,imag;
	Complex(){ }
	Complex( const Complex & c ) {
		real = c.real;
		imag = c.imag;
		cout << “Copy Constructor called”;
	}
};
Complex c1;
Complex c2(c1);//调用自己定义的复制构造函数,输出 Copy Constructor called

不允许有形如 X::X( X )的构造函数,一定要是一个引用,即“&”, 不能直接是一个对象。

class CSample {
	CSample( CSample c ) {
	} //错,不允许这样的构造函数
};

复制构造函数起作用的三种情况

情况1:当用一个对象去初始化同类的另一个对象时。以下两者是等价的。

Complex c2(c1);
Complex c2 = c1; //初始化语句,非赋值语句

情况2:如果某函数有一个参数是类 A 的对象,那么该函数被调用时,类A的复制构造函数将被调用。

class A
{
	public:
	A() { };
	A( A & a) {
		cout << "Copy constructor called" <<endl;
	}
};
void Func(A a1){ }
int main(){
	A a2;
	Func(a2);//进入到Func中的形参a1是一个对象,是要用a2初始化的,初始化时调用的就是类A的复制构造函数
	return 0;
}
输出: Copy constructor called

情况3: 如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用

class A
{
	public:
		int v;
		A(int n) { v = n; };
		A( const A & a) {
			v = a.v;
			cout << "Copy constructor called" <<endl;
		}
};
A Func() {
	A b(4);//调用默认构造函数
	return b;//调用复制构造函数,参数就是b
}
int main() {
	cout << Func().v << endl;
	 return 0;
}
输出:
Copy constructor called
4

注意:对象间赋值并不导致复制构造函数被调用

class CMyclass {
	public:
		int n;
		CMyclass() {};
		CMyclass( CMyclass & c) { 
			n = 2 * c.n ;
		 }
};
int main() {
	CMyclass c1,c2;
	c1.n = 5;
	c2 = c1;//赋值语句,不调用复制构造函数
	CMyclass c3(c1);//调用复制构造函数
	cout <<"c2.n=" << c2.n << ",";
	cout <<"c3.n=" << c3.n << endl;
	return 0;
}
输出:c2.n=5,c3.n=10

常量引用参数的使用

void fun(CMyclass obj_ ) {
	cout << "fun" << endl;
}

这样的函数,调用时生成形参会引发复制构造函数调用,开销比较大。
所以可以考虑使用 CMyclass & 引用类型作为参数。这时是不会调用复制构造函数,自然可以节省开销,这时传进去的就是引用的实参,没有计算开销。
如果希望确保实参的值在函数中不应被改变,那么可以加上const 关键字:

void fun(const CMyclass & obj) {
	//函数中任何试图改变 obj 值的语句都将是变成非法
}

为什么要自己写复制构造函数?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第二周 类和类的对象基础 笔记 之 复制构造函数 的相关文章

  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 获取 TextBox 中的文本行数

    我试图通过标签显示文本框中的文本行数 但是 问题是如果最后一行为空 标签必须显示没有空行的行号 例如 如果它们有 5 行 最后一行为空 则标签应将行数显示为 4 Thanks private void txt CurrentVinFilte
  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 当 foreach 块的内容具有 Conditional 属性时,C# 编译器是否会对其进行优化?

    我正在工作中编写一些调试代码 我想知道我所做的是否会损害性能 让我们看一下代码 foreach var item in aCollection Debug WriteLine item Name 我知道 Debug 类使用 Conditio
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • postman工具批量调用接口

    1 先在Collections中建一个文件夹 然后新建一个接口保存 2 然后选择Run 3 准备一个txt文件 增加要循环的参数json数组 4 选择接口 上传文件 配置参数 Iterations为线程数 Delay为推迟多久 然后点下面的
  • 3Dgame_homework8

    3D游戏 作业8 简单粒子制作 要求 相关理论 粒子系统 Unity 粒子系统 拟物控制 制作过程 准备 实现 光 光晕 星光 制作结果与控制 简单粒子制作 要求 按参考资源 Unity3d Particle System 系统的学习 三
  • Discuz! X3.4:若检测到未登录,返回提示登录链接

    if trim G username return lt lt
  • Java8中 Date和LocalDate的相互转换

    一 简述 Date对象表示特定的日期和时间 而LocalDate Java8 对象只包含没有任何时间信息的日期 因此 如果我们只关心日期而不是时间信息 则可以在Date和LocalDate之间进行转换 二 Date转LocalDate 如果
  • linux svn 修改回退,玩转SVN-版本回退

    当我们想放弃对文件的修改 可以使用 SVN revert 命令 svn revert 操作将撤销任何文件或目录里的局部更改 我们对文件 readme 进行修改 查看文件状态 root runoob svn runoob01 trunk sv
  • Python之模块打包

    1 什么是模块打包 模块打包目的是让自己开发的功能能够实现共享 供给他人使用 包管理索引平台 Python Package Index 2 怎么打包 tar gz格式 这个就是标准压缩格式 里面包含了项目元数据和代码 可以使用Python
  • 2021.06.15

    括号生成 力扣 方法 回溯 回溯算法框架 result def backtrack 路径 选择列表 if 满足结束条件 result add 路径 return for 选择 in 选择列表 做选择 backtrack 路径 选择列表 撤销
  • DeBruijin 【HDU - 2894】【欧拉回路】

    题目链接 可以说这题是着实有趣了 题意 我们给出一个K 现在我们想最多的表示从 的数 也就是00 0 11 1 0 1都是K个 譬如说K 3 我们可以用字典序最小的 00010111 按顺序的用二进制表示 000 001 010 101 0
  • github Page博客速度优化+Cloudflare_https两端配置+解决重定向次数过多问题

    网站加速调优 自从加了CDN之后我的博客偶尔会报错 重定向次数过多 症状 XXX XXX XXX 将您重定向的次数过多 尝试清除 Cookie ERR TOO MANY REDIRECTS 可能原因 参考阿里云cdn解决方案https he
  • Spark机器学习实例

    2020 07 09 引言 Learning Spark 过程中只是简单介绍了mllib中的东西 没有一个完整的实践过程 暂时还没有去找有没有专门做这种的书 好像我看 spark in action 是有这部分内容 后续在看 本篇文章就利用
  • BERT:深度双向预训练语言模型

    论文标题 BERT Pre training of Deep Bidirectional Transformers for Language Understanding 论文链接 https arxiv org abs 1810 04805
  • AJAX发送对象参数及Spring 4.3----@GetMapping, @PostMapping, @PutMapping, @DeleteMapping)

    前言 Spring4 3中引进了 RestController GetMapping PostMapping PutMapping DeleteMapping PatchMapping 来帮助简化常用的HTTP方法的映射 并更好地表达被注解
  • CSS flex属性

    flex弹性盒模型 让所有弹性盒模型对象的子元素都有相同的长度 且忽略它们内部的内容 可以做到水平布局 div div div div
  • 随机改变背景颜色

    开发工具与关键技术 VS 2019 JS 作者 唐嘉怡 撰写时间 2022 5 8 注意 要按照步骤一步一步执行下去 设置一个div盒子 给这个盒子一个id名为box 并给这个盒子设置样式 再设置一个随机改变背景颜色的按钮 给他一个id名为
  • 解决element 弹窗屏幕变灰的问题(双层弹窗)(遮罩层问题)

    问题 新增按钮弹窗 新增按钮里需要选择部门 又一个弹窗 此时点第二个弹窗的时候页面会灰 解决 在最后一个弹窗上面加属性 append to body true 就能解决 element 已经说明了问题 嵌套Dialog必须指定该标签 这个属
  • 精讲Flutter官网的第一个例子

    原文链接 前言 学习Flutter你一定会看到官网的第一个例子 中文版 或 英文版 但是作为新手 或许你看的会很费劲 这篇文章的目的是帮助你更好的理解这个例子 最终的效果图 我们先分析一下如何实现上图中的效果 Android开发者 1 准备
  • 【Spring Boot】——集成lombok

    还在编写无聊枯燥又难以维护的POJO吗 洁癖者的春天在哪里 请看Lombok 在过往的Java项目中 充斥着太多不友好的代码 POJO的getter setter toString 异常处理 I O流的关闭操作等等 这些样板代码既没有技术含
  • 用c语言实现扫雷小游戏。

    相信小伙伴在学习c语言的时候想做一些小趣事 下面就是用c语言来实现一个扫雷小游戏 不过是简单的实现扫雷 只是通过数组的方式来实现 适合新手学习 我用的是vs敲的这个代码 大家可以用vs运行 可能有些小地方不支持其他编译器 不过自己可以修改
  • 如何整理计算机本地磁盘文件夹,怎么清理c盘无用文件,10招教你如何清除C盘除系统外的所有垃圾...

    C盘简介 C盘是电脑硬盘的主分区之一 一般用于储存或安装系统使用 C盘对于本地硬盘的单操作系统来说 是很重要的 所以平时存放文件尽量不要放在C盘 但是在使用的过程中难免会不注意从而导致C盘空间不足 下面小棠为大家提供了清理C盘的十种方法 P
  • 中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第二周 类和类的对象基础 笔记 之 复制构造函数

    第二周 类和类的对象基础 1 类和对象的基本概念 2 2 构造函数 3 复制构造函数 4 类型转换构造函数和析构函数 5 构造函数析构函数调用时机 3 复制构造函数 用一个同类的已存在对象 复制它 来初始化一个新的对象 只有一个参数 即对同