【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 )

news2025/1/20 14:54:05

文章目录

  • 一、拷贝构造函数概念
  • 二、对象值作为函数参数
    • 1、拷贝构造函数调用情况说明
    • 2、代码示例 - 对象值作为函数参数
  • 三、对象值作为函数返回值
    • 1、拷贝构造函数调用情况说明
    • 2、代码示例 - 对象值作为函数返回值

博客总结 :

" 拷贝构造函数 " 又称为 " 赋值构造函数 " , 该类型构造函数有 4 种调用时机 ;

  • ① 使用一个对象初始化另外一个对象 : 使用 一个 类实例对象 初始化 另外一个 类实例对象 ;
	// 使用一个对象初始化另外一个对象
	// 直接手动 调用拷贝构造函数
	Student s2 = Student(s1);
  • ② 将一个对象赋值给另外一个对象 : 将 一个 类实例对象 赋值给 另外一个 类实例对象 ;
	// 将一个对象赋值给另外一个对象
	// 自动调用拷贝构造函数
	Student s2 = s1;
  • ③ 对象值作为函数参数 : 类的实例对象 以值的方式 传递给函数 , 不是以 指针 或 引用 的方式 ;
// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
}
  • ④ 对象值作为函数返回值 : 函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ;
// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
	Student s1(18, 170);
	return s1;
}




一、拷贝构造函数概念




C++ 语言中的 拷贝构造函数 是 C++ 类中的 特殊构造函数 ,

其作用是 创建一个新的 类实例对象 , 作为现有实例对象的 拷贝后的副本 ;

拷贝构造函数 的 主要作用 是初始化新创建的对象 , 使其内容与原对象完全相同 ;






二、对象值作为函数参数




1、拷贝构造函数调用情况说明


类的实例对象 以值的方式 传递给函数 , 不是以 指针 或 引用 的方式 ;


这种情况 是 以 类的 实例对象 值作为参数 , 与 对象值 相对的是

  • 对象指针
  • 对象引用

定义函数 void fun(Student s) , 该函数 的 形参是 Student 类型对象 ,


// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
}

如果调用该函数 , 需要拷贝实参 , 将 实参的副本值 , 也就是对象值 传递给函数形参 , 这个过程需要调用 Student 类的 拷贝构造函数 ;

该操作 全程 由 C++ 编译器完成 , 不需要 开发者 手动干预 ;


2、代码示例 - 对象值作为函数参数


代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "调用带参数构造函数" << endl;
	}

	Student(const Student& s)
	{
		m_age = s.m_age;
		m_height = s.m_height;
		cout << "调用拷贝构造函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
	
}

int main()
{
	// 调用带参数构造函数
	Student s1(18, 170);

	// 类对象值作为函数参数
	fun(s1);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

  • 首先 , Student s1(18, 170) 调用带参数构造函数 , 创建 Student 类实例对象 ;
  • 然后 , 将创建的实例对象 传递给 fun 函数 , 传递时由于传递的是 对象值 , 需要拷贝对象副本 , 拷贝副本时会自动调用 Student 类的 拷贝构造函数 ;
调用带参数构造函数
调用拷贝构造函数
Press any key to continue . . .

在这里插入图片描述





三、对象值作为函数返回值




1、拷贝构造函数调用情况说明


函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ;


下面的代码 , 定义了函数 , 返回在函数内部创建的 Student 类实例对象 ;

// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
	Student s1(18, 170);
	return s1;
}

由于 函数作用域结束后 , 其栈内存会被释放 , 在栈内存中的 Student 对象也会被销毁 , 因此 Student 类型的返回值需要返回一个副本 , 这个副本需要调用 拷贝构造函数 创建 ;


2、代码示例 - 对象值作为函数返回值


代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "调用带参数构造函数" << endl;
	}

	Student(const Student& s)
	{
		m_age = s.m_age;
		m_height = s.m_height;
		cout << "调用拷贝构造函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
	Student s1(18, 170);
	return s1;
}

int main()
{

	// 类对象值作为函数返回值
	fun();


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

在这里插入图片描述

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

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

相关文章

MySQL之分布式事务

写在前面 当数据库进行了分库分表 之后为了保证数据的一致性。不可变的就需要引入跨数据的事务解决方案&#xff0c;这种解决方案我们叫做分布式事务。本文就一起来看下分布式事务相关的内容。 在8.0 版本上学习。 1&#xff1a;实战 为了能够更好的理解理论知识&#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++项目实战——基于多设计模式下的同步异步日志系统-②-前置知识补充-不定参函数

文章目录 专栏导读不定参函数C风格不定参函数不定参宏函数 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;CSDN内容合伙人…致力于 C/C、Linux 学…

数据分析三剑客之Matplotlib

0.Matplotlib绘图和可视化 1.简介 我的前面两篇文章介绍了 Nimpy &#xff0c;Pandas 。今天来介绍一下Matplotlib。 简单来说&#xff0c;Matplotlib 是 Python 的一个绘图库。它包含了大量的工具&#xff0c;你可以使用这些工具创建各种图形&#xff0c;包括简单的散点图&…

Java多线程并发面试题

文章目录 Java并发基础并行和并发有什么区别&#xff1f;说说什么是进程和线程&#xff1f;Java线程创建方式&#xff1f;Runnable和Callable接口的区别&#xff1f;为什么调用start()方法时会执行run()方法&#xff0c;不直接调用run()方法&#xff1f;sleep()和wait()的区别&…

预约陪诊就诊小程序源码多城市开发版

陪诊小程序多城市版开发 小程序支持多城市开通&#xff0c;支持创建陪诊团队以及提成奖励设置&#xff0c;可以定义多种服务类型&#xff0c;订单流程简单明了&#xff0c;支持陪诊师手机端订单处理&#xff0c;家政类目可以轻松过审。 小程序市场前景&#xff1a; 人口老龄化…

强大:dynamsoft-barcode-reader-dotnet-9.6.30 Crack

dynamsoft-barcode-reader-dotnet 具有灵活 API 的强大条码扫描器 SDK 无论它是扭曲的、黑暗的、遥远的、模糊的、批量的还是移动的&#xff0c;我们都可以扫描它。速度快 条码扫描速度每分钟500 业界最快的扫描解码&#xff0c;可应用于不同场景&#xff1a; 多个条形码/二维…

【VS2022】调试

F9 创建或取消断点 ctrlF9 禁用断点 F5 开始调试&#xff08;到断点处停下来&#xff09; F10 逐过程&#xff08;不进入函数&#xff09; F11 逐语句 F5、F10、F11都可以直接进入调试 【调试】->【窗口】->【监视】&#xff0c;输入变量就可以观察到变量的值。 …

C语言数组和指针笔试题(二)(一定要看)

目录 字符数组二例题1例题2例题3例题4例题5例题6例题7总结 字符数组三例题1例题2例题3例题4例题5例题6例题7 字符数组二 char arr[] {a,b,c,d,e,f} 1:printf("%d\n", strlen(arr)); 2:printf("%d\n", strlen(arr0)); 3:printf("%d\n", strlen(…

Python小项目之Tkinter应用】随机点名/抽奖工具大优化:新增查看历史记录窗口!语音播报功能!修复预览文件按钮等之前版本的bug!

文章目录 前言一、实现思路二、关键代码查看历史记录按钮语音播报按钮三、完整代码总结前言 老生常谈,先看效果:(订阅专栏可获取完整代码) 初始状态下,我们为除了【设置】外的按钮添加弹窗,提示用户在使用工具之前要先【设置】。在设置界面,我们主要修改了【预览文件】…

每日一题 2596. 检查骑士巡视方案

难度&#xff1a;中等 很简单&#xff0c;从第 0 步开始模拟即可&#xff0c;唯一sb的就是测试用例中如果&#xff08;0&#xff0c;0&#xff09;处不为0的话就直接false&#xff0c;而不是去找0在哪 我的代码&#xff1a; class Solution:def checkValidGrid(self, grid: L…

2000-2021年上市公司全要素生产率数据OP法(含原始数据+计算代码+结果)

2000-2021年上市公司全要素生产率数据OP法&#xff08;含原始数据计算代码结果&#xff09; 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;股票代码、年份、证券代码、固定资产净额、营业总收入、营业收入、营业成本、销售费用、管理费用、财务费用、支付给职工以及为…

防火墙 (五十四)

目录 前言 一、防火墙作用 二、防火墙分类 三、防火墙性能 四、硬件防火墙 五、软件防火墙 5.1 iptables 六、iptables应用 前言 本文就简单的介绍了防火墙的基础内容和一些简单案例的操作。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、防火墙…

jmeter线程组 bzm - Concurrency Thread Group 阶梯式压测

简介 bzm - Concurrency Thread Group 不是JMeter的官方插件&#xff0c;而是一种由Blazemeter提供的高级线程组插件&#xff0c;它提供了更灵活的并发性能测试设置。它可以在不同的时间内并发执行不同数量的线程&#xff0c;模拟不同的负载场景。 插件下载地址&#xff08;jme…

信创办公–基于WPS的EXCEL最佳实践系列 (通过函数实现灵活限制)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;通过函数实现灵活限制&#xff09; 目录 应用背景操作步骤1、sum函数的应用2、and函数的应用3、日期相关函数的应用4、eomonth函数的应用 应用背景 在Excel表格中&#xff0c;我们经常遇到需要大量计算或需要特殊处理的数据…

安达发|家具制造业APS高级计划与排程解决方案

在当今竞争激烈的市场环境下&#xff0c;家具制造业面临着诸多挑战&#xff0c;如原材料价格波动、人工成本上升、市场需求不确定性等。为了降低成本、提高生产效率和满足客户需求&#xff0c;家具制造企业需要寻求有效的计划与排程解决方案。本文将介绍一种基于先进生产计划系…

基于SSM的彩妆小样售卖商城

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

Cpp/Qtday060913cpp基础

目录 将栈类实现成模板类 代码 效果 将队列类实现成模板类 代码 效果 思维导图 将栈类实现成模板类 代码 #include <iostream>using namespace std;template<typename T> class Stack { private:T data[128];int top; public:Stack();//Stack(T unit);~St…

比亚迪海洋家族再添新成员,合资车企又该绷不住了

燃油搅局者比亚迪最近又又又上新车啦&#xff0c;这次带来的是海洋家族中大型插电混动轿车—海豹 DM-i。 啥叫插电混动&#xff1f;简单来说同时搭载了汽油发动机、可外接电源充电的电池和电机&#xff1b; 有电时用电驱动电机做工&#xff0c;没电时用油驱动发动机做工&#…

pycharm虚拟环境安装指定python版本/ python3.8 / 从python3.9降级到3.8

我在网上找了一圈发现各种命令,尤其是说: virtualenv -p python3 py38 可以指定版本,我真的酸Q ! 这个命令是意思是创建一个 py38 目录,实际上用的版本还是环境变量所指向的版本. 1.下载 python 版本 要想指定版本,肯定是需要本机已经有一个版本,然后指定这个版本作为虚拟环…