StringBad ditto (motto)

第12章 类和动态内存分配

StringBad ditto (motto): // calls StringBad (comst StringBad &)
StringBad metoo - motto: // calls StringBad (const StringBad &)
StringBad also = StringBad (motto):
// calls StringBad (const StringBad &)
StringBad * pStringBad = new StringBad (motto):
// calls StringBad (const StringBad &)
其中中间的2种声明可能会使用复制构造函数直接创建metoo和also,也可能使用复制构造函数生成
一个临时对象,然后将临时对象的内容赋给metoo和also,这取决于具体的实现。最后一种声明使用motto
初始化一个匿名对象,并将新对象的地址赋给pstring 指针。
每当程序生成了对象副本时,编译器都将使用复制构造函数。具体地说,当函数按值传递对象(如程
序清单 12.3 中的callme2())或函数返回对象时,都将使用复制构造函数。记住,按值传递意味着创建原
始变量的一个副本。编译器生成临时对象时,也将使用复制构造函数。例如,将3个Vector对象相加时,
编译器可能生成临时的Vector对象来保存中间结果。何时生成临时对象随编译器而异,但无论是哪种编译
器,当按值传递和返回对象时,都将调用复制构造函数。具体地说,程序清单12.3中的函数调用将调用下
面的复制构造函数:
callme2 (headline2) :
程序使用复制构造函数初始化sb-callme2()函数的StringBad型形参。
由于按值传递对象将调用复制构造函数,因此应该按引用传递对象。这样可以节省调用构造函数的时
间以及存储新对象的空间。
(2)复制构造函数的功能
默认的复制构造函数逐个复制非静态成员(成员复制也称为浅复制),复制的是成员的值。在程序清单
12.3中,下述语句:
StringBad sailor = sports:
与下面的代码等效(只是由于私有成员是无法访问的,因此这些代码不能通过编译):
StringBad sailor:
sailor.str = sports.str:
sailor.len = sports.len:
如果成员本身就是类对象,则将使用这个类的复制构造函数来复制成员对象。静态函数(如
num_strings)不受影响,因为它们属于整个类,而不是各个对象。图12.2说明了隐式复制构造函数执行的
操作。

3. 复制构造函数的哪里出了问题
现在介绍程序清单 12.3 的两个异常之处(假设输出为该程序清单后面列出的)。首先,程序的输出表
明,析构函数的调用次数比构造函数的调用次数多2,原因可能是程序确实使用默认的复制构造函数另外
创建了两个对象。当callme2()被调用时,复制构造函数被用来初始化callme2()的形参,还被用来将对象
sailor初始化为对象sports。默认的复制构造函数不说明其行为,因此它不指出创建过程,也不增加计数器
num_strings的值。但析构函数更新了计数,并且在任何对象过期时都将被调用,而不管对象是如何被创建
的。这是一个问题,因为这意味着程序无法准确地记录对象计数。解决办法是提供一个对计数进行更新的
显式复制构造函数:
String :: String (const String & s)

num_ strings++:
.. // important stuff to go here

提示:如果类中包含这样的静态数据成员,即其值将在新对象被创建时发生变化,则应该提供一个显
式复制构造函数来处理计数问题。
第二个异常之处更微妙,也更危险,其表现之一是字符串内容出现乱码:
headline2: D0º

385

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

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

相关文章

python c语言 代码动态检查,python c语言语法分析

大家好,小编来为大家解答以下问题,python c语言 代码动态检查,python c语言语法分析,今天让我们一起来看看吧! Source code download: 本文相关源码 初学编程,应该学习哪一门编程语言,有不少人感…

项目经理面试10问

今天我们来说说项目经理专业面试的十条经验总结。如果你认真阅读并思考,相信对在屏幕前的你会有所帮助和启发。 1、请做一下自我介绍 自我介绍很重要。无论面试什么岗位,面试官通常都会问你一个最常见的问题:“请做一下自我介绍。” 在准备…

机器学习的算法简单介绍-随机森林算法

随机森林 随机森林目前在学习的过程中,并未使用到,因此,仅仅简单的介绍一下相应的概念和应用的方面,等后续学习的过程中使用到,会继续进行补充。 随机森林(Random Forest)可以看作是一种集成学…

C语言——格式说明符前面加修饰符

在C语言中,格式说明符前面可以添加一些修饰符来控制输出或输入的格式,主要包括宽度、精度、左对齐标志和前缀填充字符等。 1. 宽度(Width) %[width]type:这里的width是一个非负整数,表示输出字段的最小宽度…

java 属性复制为空属性不复制

工具类 package com.jiayou.peis.common.core.util;import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl;import java.util.HashSet; import java.util.Set;/*** 自定义属性复制*/…

Vue 生命周期有哪些?作用是什么?

什么是vue的生命周期 Vue 实例从开始创建、初始化数据、编译模板、挂载Dom和渲染、更新和渲染、卸载等一系列过程,这是 Vue 的生命周期 vue的生命周期的八个钩子函数 beforeCreat() 创建前 在new一个vue实例后,只有一些默认的生命周期钩子和默认事件&a…

Unity坦克大战开发全流程——开始场景——开始界面

开始场景——开始界面 step1:设置UI 反正按照这张图拼就行了 step2:写脚本 前面的拼UI都是些比较机械化的工作,直到这里写代码的时候才真正开始有点意思了,从这里开始,我们就要利用面向对象的思路来进行分析&#xff1…

虾皮跨境电商选品有哪些规则

如何在虾皮(Shopee)平台上进行跨境电商选品在如今全球化的商业环境中,跨境电商已成为许多卖家拓展业务的重要途径。虾皮(Shopee)作为一家知名的跨境电商平台,为卖家提供了丰富的销售机会。然而,…

【C++核心编程(二)】

一、类和对象 C面向对象的三大特性为:封装、继承、多态。 C认为万事万物都皆为对象,对象上有其属性和行为。 例如: 人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌... 车也可以作为对象,属性…

HTML中的主根元素、文档元数据、分区根元素、内容分区、文本内容 和 内联文本语义

本文主要介绍了HTML中主根元素<html>、文档元数据<base>、<head>、<link>、<meta>、<style>、<title>、分区根元素<body>、内容分区<address>、<article>、<aside>、<footer>、<h1> (en-US), &…

3dmax全景图用什么渲染 全景图云渲染使用教程

在给客户展示设计概念时&#xff0c;应用3ds Max创建的全景图是一个高效直观的方法。这种方式不仅可以全方位地呈现整个空间&#xff0c;让客户沉浸式地感受设计师的创意&#xff0c;而且在展现大型空间设计&#xff0c;如展览馆或者会议室等&#xff0c;效果尤其显著&#xff…

在mac上怎么方便的编辑xml文件

在Mac上 XML 文件不能默认以较直观的方式在“文本编辑”中打开&#xff0c;如果已安装 Xcode&#xff0c;你可以使用 Xcode 打开 XML 文件。在 Xcode 中&#xff0c;XML 文件通常会以可视化的方式显示&#xff0c;使得编辑更加直观&#xff0c;但是如果你不想安装 XCode&#x…

Win10 开机突然时出现0xc000014c错误怎么办?

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 开机突然时出现0xc000014c错误怎么办&#xff1f; 尝试F8模式也进不了还是这个画面 文件&#xff1a;\Windows\System32\config\system 状态&#xff1a;0xc000014c 信息&#xff1a;无法加载操作系统&#xff…

摆烂式学习ssh

摆烂式学习ssh ssh工作原理ssh基本使用sshd配置文件密钥登录1.客户端2.服务器3.注意事项4.使用密钥登录测试 ssh高级使用技巧1.在非正规端口启动2.rsync 命令3.透过 ssh 通道加密原本无加密的服务4.以ssh信道配合x server 传递图形接口5.ssh配合virtualbox虚拟机使用技巧 ssh工…

Python高级用法:装饰器(decorator)

装饰器&#xff08;decorator&#xff09; Python装饰器的作用是使函数包装与方法包装&#xff08;一个函数&#xff0c;接受函数并返回其增强函数&#xff09;变得更容易阅读和理解。最初的使用场景是在方法定义的开头能够将其定义为类方法或静态方法。 不使用装饰器的代码如…

杨中科.NET Core 教程 第一部分-2- .NET Core的重要问题

.NETCore 和 .NETFramework区别 尽管绝大部分用法都没变&#xff0c;但是.NET Core不是 .NET Framework的升级版&#xff0c;无法直接升级 用Mono&#xff0c;.NET Framework程序可以直接运行在Linux下。有了Mono&#xff0c;为啥微软还搞.NET Core? .NET Framework缺点&am…

主干网络篇 | YOLOv8 更换骨干网络之 ResNet50/ResNet101 | 原论文一比一复现

论文地址:https://arxiv.org/abs/1512.03385v1 更深层的神经网络更难以训练。我们提出了一个残差学习框架,以便于训练比以往使用的网络更深层的网络。我们明确地将层重构为学习相对于层输入的残差函数,而不是学习无参考的函数。我们提供了全面的实证证据,表明这些残差网络…

Unity 欧盟UMP用户隐私协议Android接入指南

Unity 欧盟UMP用户协议Android接入指南 官方文档链接开始接入mainTemplate.gradle 中引入CustomUnityPlayerActivity 导入UMP相关的包java类中新增字段初始化UMPSDK方法调用![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d882171b068c46a1b956e80425f3a9cf.png)测…

1月3日,每日信息差

第一、美国年度LNG出口量首登全球第一&#xff0c;美国2023年出口了9120万吨LNG&#xff0c;超过澳大利亚和卡塔尔成为全球最大的LNG出口国。美国LNG出口增加&#xff0c;主要得益于德州自由港LNG工厂重启。自由港LNG是美国最大的天然气出口商&#xff0c;该工厂在2022年6月发生…

【技能---onnxruntime (C++/CUDA) 编译安装制定版本及部署】

文章目录 onnxruntime安装编译基础编译环境要求克隆ONNX Runtime源代码仓库配置和构建ONNX Runtime安装ONNX Runtime onnxruntime安装编译 主要介绍C版本的onnxruntime安装编译及其使用 基础编译环境要求 不同版本ONNXRuntime C对于cmake版本有不同的需求。 例如&#xff1a…