Foo a30 = Foo(123);会调用哪些构造函数

news2024/11/19 21:21:35

一、解答

在您提供的代码中,表达式 Foo a30 = Foo(123); 会直接调用 Foo 类中接受一个 int 类型参数的构造函数。这里是构造函数的调用过程:

  1. Foo(123) 创建了一个临时的 Foo 对象,使用的是接受 int 参数的构造函数。这个构造函数内部会执行 cout << "Foo(int)" << endl;,从而输出 "Foo(int)"。

  2. 随后,这个临时对象会被用来初始化 a30。然而,在这个特定的场景下,并不会发生拷贝构造或移动构造,因为 a30 是直接被初始化的,没有涉及到临时对象的拷贝或移动。这得益于C++17引入的保证复制省略(Guaranteed Copy Elision, GCE),也称作强制复制省略,它确保了在这种情况下不会发生不必要的拷贝或移动操作。

因此,对于表达式 Foo a30 = Foo(123);,只会调用一次构造函数,即接受 int 参数的构造函数。

如果您的编译器支持C++17或更高版本,并且您启用了相应的优化,那么上述行为是确定的。如果您使用的是更早的C++标准,编译器可能会执行拷贝构造或移动构造,尽管现代编译器通常会在这种场景下进行优化以省略不必要的操作。在C++11和C++14中,这种行为被称为拷贝省略(Copy Elision),但它不是强制的,而是编译器优化的结果。

总结来说,在C++17及以后的版本中,Foo a30 = Foo(123); 只会调用接受 int 参数的构造函数一次。

二、C++17引入的保证复制省略(Guaranteed Copy Elision, GCE),也称作强制复制省略

从C++发展历史看来,c++ 17引入了一个规则,要求在满足一定的条件下避免对象的复制,这在以前是可选的。C++17中一个叫做强制复制省略的技术就是基于这个观点的。
至少包括以下两项内容:
1. 返回值优化(RVO),即通过将返回值所占空间的分配地点从被调用端转移至调用端的手段来避免拷贝操作。返回值优化包括具名返回值优化(NRVO)与无名返回值优化(URVO),两者的区别在于返回值是具名的局部变量还是无名的临时对象。


2. 右值拷贝优化,当某一个类类型的临时对象被拷贝赋予同一类型的另一个对象时,通过直接利用该临时对象的方法来避免拷贝操作。

我们先来看看临时对象拷贝的代码:

#include <iostream>
 
class BigObject
{
public:
    BigObject()
    {
        std::cout << "constructor. " << std::endl;
    }
    ~BigObject()
    {
        std::cout << "destructor. " << std::endl;
    }
      BigObject(const BigObject& other)
    {
        std::cout << "copy constructor. " << std::endl;
    }
};
 
BigObject Foo() 
{
   BigObject local_obj;
   return local_obj;
}
 
int main() 
{
    BigObject obj = Foo();
    return 0;
}

禁用“复制省略”优化

复制省略优化后

constructor. 
destructor.

分析:代码在第22行通过默认构造函数创建了一个对象local_obj,在Foo()函数返回的时候,通过调用拷贝构造函数生成了一个临时的对象,这里就叫做temp_obj吧。这个temp_obj就是Foo()函数返回时生成的临时对象。当函数返回后,local_obj的生命周期结束了,调用析构函数销毁了。然后在28行,obj对象又被temp_obj对象进行拷贝初始化[尽管这里是用等于号,但这里不用赋值拷贝构造函数的,因为obj是定义的同时初始化的],又调用了一次拷贝构造函数。接着temp_obj对象析构,最后obj对象析构。

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

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

相关文章

6.数据结构与算法-线性表的链式表示和实现-单链表

链式存储结构 与链式存储有关的术语 单链表&#xff0c;双链表&#xff0c;循环链表 头指针&#xff0c;头节点&#xff0c;首元节点 有无头节点的区别 如何表示空表 设置头节点的好处 头节点的数据域内装什么 链表&#xff08;链式存储&#xff09;的特点 带头节点的单链表 单…

【中级通信工程师】综合能力:2024年真题回顾(附答案)

【零基础3天通关中级通信工程师】 综合能力&#xff1a;2024年真题回顾 本文是根据参加考试的回忆并且结合网上几版资料复原的2024年通信考试中级《综合能力》的真题考卷&#xff0c;旨在为广大考生提供复习和备考的参考&#xff0c;试卷大体和真题相符&#xff0c;部分选项回…

算法闭关修炼百题计划(一)

多看优秀的代码一定没有错&#xff0c;此篇博客属于个人学习记录 1.两数之和2.前k个高频元素3.只出现一次的数字4.数组的度5.最佳观光组合6.整数反转7.缺失的第一个正数8.字符串中最多数目的子序列9.k个一组翻转链表10.反转链表II11. 公司命名12.合并区间13.快速排序14.数字中的…

Windows Defender 强力删除工具 Defender Remover 下载

DefenderRemover.exe官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供DefenderRemover.exe最新版正式版官方版绿色版下载,DefenderRemover.exe安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123865.com/s/ajCgTd-79HEDefenderRemo…

文件传输工具 | 闪电藤 v2.5.5 绿色版

软件简介 闪电藤是一款基于LocalSend二次开发的局域网文件传输工具。它特别针对中国用户的使用习惯&#xff0c;对UI交互进行了重新设计&#xff0c;并在功能上进行了增强和删减。这款工具的特点包括极简无广告的界面&#xff0c;无需登录即可使用&#xff0c;能够自动连接同一…

一钉多用:自攻螺钉在家居与工业领域的广泛应用

自攻螺钉的结构要素有哪些重要特点&#xff1f; 自攻螺钉适用于非金属或软金属&#xff0c;不需要配合预先开好的孔和攻牙。自攻螺钉的尖头设计使其能够“自我攻入”材料中&#xff1b;而普通螺丝通常是平头&#xff0c;规格一致。自攻螺钉的关键在于&#xff0c;打孔时不需要进…

Java五子棋

目录 一&#xff1a;案例要求&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a; 一&#xff1a;案例要求&#xff1a; 实现一个控制台下五子棋的程序。用一个二维数组模拟一个15*15路的五子棋棋盘&#xff0c;把每个元素赋值位“┼”可以画出棋…

猴子都看不懂的矩阵乘法——由向量乘矩阵到矩阵乘矩阵

矩阵乘法 仅为初学者的理解&#xff0c;不喜勿喷 矩阵&#xff0c;即为如下形式的结构&#xff1a; 0 1 1 1 1 0 1 0 1 \begin{matrix} 0&1&1\\ 1&1&0\\ 1&0&1\\ \end{matrix} 011​110​101​ 既然你准备仔细阅读这篇文章&#xff0c;那么相信你应…

5个你一定要知道的Word使用小技巧

在职场中&#xff0c;Microsoft Word已经成为我们日常工作中必不可少的工具。无论是制作报告、文档还是演示文稿&#xff0c;Word都扮演着重要的角色。 许多人已经掌握了Word使用小技巧&#xff0c;今天小编给大家整理了Word表格小技巧&#xff0c;这5个你一定要知道哦&#xf…

软考论文《论NoSQL数据库技术及其应用》精选试读

论文真题 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

Linux防火墙-nat表

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令&#xff0c;我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…

C++:模拟实现vector

目录 成员变量与迭代器 size capacity empty 迭代器有关函数 实现默认成员函数的前置准备 reserve ​编辑 ​编辑 push_back 构造函数 无参构造 迭代器区间构造 n个val来进行构造 析构函数 拷贝构造函数 赋值重载 增删查改 clear resize pop_back inser…

Go语言匿名字段使用与注意事项

1. 定义 Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段&#xff0c;称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式&#xff0c;所以也可以称作嵌套字段。 这种方式可以实现组合复用&#xff0c;即通过匿名字段&#xff0c;结构体…

开放原子开源基金会网站上的开源项目Opns存在缓冲区溢出缺陷

最近在开放原子开源基金会网站上&#xff0c;看到一些开源项目&#xff0c;之前分析出华为的鸿蒙操作系统代码&#xff0c;没有发现有价值的安全漏洞。现在&#xff0c;下载上面的Onps开源网络协议栈&#xff0c;既然是通讯所使用的软件&#xff0c;其质量应该值得信任呢&#…

LeetCode[中等] 238. 除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂…

828华为云征文 | 云服务器Flexus X实例:向量数据库 pgvector 部署,实现向量检索

目录 一、什么是向量数据库 pgvector &#xff1f; 二、pgvector 部署 2.1 安装 Docker 2.2 拉取镜像 2.3 添加规则 三、pgvector 运行 3.1 运行 pgvector 3.2 连接 pgvector 3.3 pgvector 常见操作 四、总结 本篇文章通过 云服务器Flexus X实例 部署向量数据库 pgve…

什么情况?上交所服务器被你们给买崩了?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友。 9月27日早上&#xff0c;A股市场迎来了一波前所未有的火爆行情&#xff0c;成交量激增&#xff0c;市场情绪高…

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器&#xff08;电位器模拟&#xff09;采集光照信息 3、可…

鸿蒙开发(NEXT/API 12)【硬件(振动开发1)】振动

通过最大化开放马达器件能力&#xff0c;振动器模块服务拓展了原生马达服务&#xff0c;实现了振动与交互融合设计&#xff0c;从而打造出细腻精致的一体化振动体验和差异化体验&#xff0c;提升用户交互效率、易用性以及用户体验&#xff0c;并增强品牌竞争力。 运作机制 Vi…

小程序原生-地理位置授权用户拒绝后的解决方案

在开发的过程中&#xff0c;我们会发现一个问题&#xff1a; 在调用 wx.getLocation() 获取用地理位置时&#xff0c;如果用户选择拒绝授权&#xff0c;代码会直接抛出错误。在拒绝授权以后&#xff0c;再次调用 wx.getLocation() 时&#xff0c;就不会在弹窗询问用户是否允许…