《Effective C++》条款20

news2024/11/23 21:19:11

宁以pass-by-reference-to-const替换pass-by-value

class A
{
public:
	A() 
	{
		cout << "A()" << endl;
	}
	A(const A& a)
	{
		cout << "A(const A& a)" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	string a1;
	string a2;
};
class B:public A
{
public:
	B()
	{
		cout << "B()" << endl;
	}
	B(const B& b)
	{
		cout << "B(const B& b)" << endl;
	}
	~B()
	{
		cout << "~B()" << endl;
	}
private:
	string b1;
	string b2;
};
bool test(B b)
{
	return true;
}
int main()
{
	B b;
	test(b);
}

以上test()函数采用了pass-by-value的方式进行参数传递,一共调用了8次函数:

这样明显不是最佳效率的调用方法

这样写会好点:

原因就是:

1.值传递会调用拷贝构造函数生成临时对象

2.因为存在继承关系,所以每次构造一个B类,就会多出来4个string对象。很影响效率

除此原因以外还有什么情况下建议使用pass-by-reference-to-const ?

还可以避免对象切割问题!

class A
{
public:
	A(string s):a1(s){}
	virtual string getvalue() const 
	{
		return a1;
	}
	string a1;
};
class B:public A
{
public:
	B(string a,string b):b1(b),A(a){}
	virtual string getvalue() const 
	{
		return b1;
	}
	string b1;
};
void getvalue1(const A& a)
{
	cout << "(const A& a): " << a.getvalue() << endl;
}
void getvalue2(A a)
{
	cout << "(A a) : " << a.getvalue() << endl;
}
int main()
{
	const B b("A","B");
	getvalue1(b);
	getvalue2(b);
}

这段代码用了两个不同参数的getvalue函数,结果也不一样!

所以得出结论:想要传递派生类对象的信息,需要使用pass-by-reference-to-const。否则会被进行对象切割,使一个派生类对象转变为基类对象。

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

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

相关文章

今天不学习今天写爱心特效HTML代码

效果&#xff1a; 操作过程 首先在桌面创建一个后缀为txt的文件&#xff0c;然后将下面的代码复制进去保存&#xff0c;再将.txt后缀改为html&#xff0c;最后点击这个文件就会出现爱心特效啦~ 具体代码如下&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.…

Ubuntu 下C++数字雨

以前写过一个Window下的数字雨&#xff0c;像黑客帝国里那样的01数字&#xff0c;现在补充一版Linux下的。使用了curses库&#xff0c;安装方法与使用方法参照 Linux下curses函数库的详细介绍_libcurses库-CSDN博客 5-linux学习笔记之-----curses-CSDN博客 效果如下&#xf…

【TEC100TAI-KIT】青翼科技基于复微青龙JFMQL100TAI的全国产化智能异构计算平台

板卡概述 TEC100TAI-KIT是我司自主研制的一款基于上海复旦微电子复微青龙100TAI的全国产智能异构计算平台开发套件&#xff0c;该套件包含1个复微青龙100TAI核心板和1个PCIE规格的扩展底板。 该套件的核心板集成了100TAI的最小系统&#xff0c;包含一颗JFMQL100TAI900片上系统…

手撕【双向链表】带头双向循环(2)

目录 Test.c DList.h DList.c SLInsert SLErase DList.c总代码 顺序表和链表的对比 今天继续再双向循环链表的基础上做修改。 ❓提问&#xff1a;请你在10分钟内写一个带头双向循环链表。 其实我们只要把SLInsert 和 SLErase 写好就大功告成了&#xff01;&#x1f197…

TensorFlow: 框架的自动微分机制

自动微分&#xff08;Automatic differentiation&#xff09;是深度学习框架中的一个关键功能&#xff0c;它为我们提供了一种便捷且高效的方式来求解函数的导数。在TensorFlow中&#xff0c;作为一款流行且强大的机器学习框架&#xff0c;自动微分机制为用户提供了一个方便的方…

004 OpenCV akaze特征点检测匹配

目录 一、环境 二、akaze特征点算法 2.1、基本原理 2.2、实现过程 2.3、实际应用 2.4、优点与不足 三、代码 3.1、数据准备 3.2、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、akaze特征点算法 特征点检测算法…

ctyunos 与 openeuler

ctyunos-2.0.1-220311-aarch64-dvd ctyunos-2.0.1-220329-everything-aarch64-dvd glibc python3 对应openEuler 20.03 LTS SP1

Selenium操作已经打开的Chrome浏览器窗口

Selenium操作已经打开的Chrome浏览器窗口 0. 背景 在使用之前的代码通过selenium操作Chrome浏览器时&#xff0c;每次都要新打开一个窗口&#xff0c;觉得麻烦&#xff0c;所以尝试使用 Selenium 获取已经打开的浏览器窗口&#xff0c;在此记录下过程 本文使用 chrome浏览器来…

Word中NoteExpress不显示的问题

首先确认我们以及安装了word插件 我们打开word却没有。此时我们打开&#xff1a;文件->选项->加载项 我们发现被禁用了 选择【禁用项目】&#xff08;如果没有&#xff0c;试一试【缓慢且禁用的加载项】&#xff09;&#xff0c;点击转到 选择启用 如果没有禁用且没有出…

基于SSM的校园家教兼职信息交流平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

μC/OS-II---消息邮箱管理1(os_mbox.c)

目录 消息邮箱创建消息邮箱删除等待邮箱中的消息向邮箱发送一则消息 消息邮箱创建 OS_EVENT *OSMboxCreate (void *pmsg) {OS_EVENT *pevent; #if OS_CRITICAL_METHOD 3u /* Allocate storage for CPU status register */OS_CPU_SR cpu_sr …

比特币上的人工智能

以感知机为例 人工智能&#xff0c;尤其是机器学习形式的人工智能&#xff0c;最近取得了巨大的进步&#xff0c;应用范围从人脸识别到自动驾驶汽车。我们建议将 AI 与比特币区块链结合起来&#xff0c;以获得许多其他方式无法实现的显着优势&#xff1a; 公开透明&#xff1a…

面试资料快速复习 Git常用命令(简单实用)

Git-command Git常用命令、面试复习、简单实用命令 ​ 一、概念理解 &#xff08;一&#xff09;工作区、暂存区、本地仓库、远程仓库 workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;本地仓库remote repository&#xff…

前端实现页面内容的截图与下载(html2canvas)

今天是一个发文的好日子&#x1f600;~ &#x1f447;&#x1f447;&#x1f447; 一个需求&#xff0c;要截取页面中的内容并截图保存&#xff0c;来看一看我是怎么实现的吧&#xff1a; 这里需要使用到插件--html2canvas 1.安装并引入html2canvas npm install html2canv…

Es 拼音搜索无法高亮

目录 背景&#xff1a; Es 版本&#xff1a; 第一步 第二步 &#xff08;错误步骤 - 只是记录过程&#xff09; 第三步 第四步 第五步 第六步 第七步 背景&#xff1a; app 原有的搜索功能无法进行拼音搜索&#xff0c;产品希望可以支持&#xff0c;例如内容中含有&a…

upload-labs关卡10(点和空格绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十关通关思路1、看源代码2、bp抓包绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测…

软件质量保护与测试(第2版)学习总结第十一章 白盒测试

错误隐藏在角落里、集聚在边界处 ----Boris Beizer 白盒测试是看源代码的&#xff0c;静态分析和动态分析 11.2 控制流测试 程序结构主要有3种 顺序结构、分支结构、循环结构 #include "stdafx.h" …

C++实现KNN和K-Means

学校机器学习课程的实验课要求实现KNN和K-Means&#xff1a; &#xff08;平时没听课&#xff09;临时去查了一下KNN和K-Means是啥&#xff0c;然后自己用C写了小例子&#xff0c;想着写都写了那就把代码贴出来吧。 顺便再聊聊自己对于这俩算法的理解。 下面是文心一言的回答…

洛谷 P3131 [USACO16JAN] Subsequences Summing to Sevens S

被普及-卡的没思路真是蒟蒻啊233 优化思路 每次都在枚举(a[r]-a[l-1])%70&#xff0c;所以可以认为数组大小对最终答案没有影响&#xff0c;考虑对前缀和数组取模&#xff0c;那么如果有a[r]的值等于a[l-1]的值相等&#xff08;即余数相等&#xff09;&#xff0c;那么两者相减…

米尔AM62x核心板,高配价低,AM335x升级首选

AM335x是TI经典的工业MPU&#xff0c;它引领了一个时代&#xff0c;即工业市场从MCU向MPU演进&#xff0c;帮助产业界从Arm9迅速迁移至高性能Cortex-A8处理器。随着工业4.0的发展&#xff0c;HMI人机交互、工业工控、医疗等领域的应用面临迫切的升级需求&#xff0c;AM62x处理器…