函数返回类的对象与拷贝构造函数

C++拷贝构造函数—类临时对象的构建与析构 临时对象一般是调用拷贝构造函数来创建的,分为以下两种情况: ①对象作为实参初始化形参时(值传递) ②对象作为函数返回值(值传递) 阅读详情

   C++中,如果我们在一个函数中,定义了一个类的对象,然后返回这个对象,在main函数中用一个对象去接受这个返回的对象的时候,这里面参与的函数调用大家可能不熟悉,这里通过程序和注释的方式给大家讲解一下。编译的环境是vs2013,我下面是进入单步调试时测试出来的结果。大家可以把下面的代码在自己的vs上面调试一下,结合着我的注释内容(我把解释部分直接放在了代码注释里面了),做更加深刻的理解。

 

#include<iostream>
using namespace std;

class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	Date(int y,int m,int d);
	Date(const Date& d);
	void setDate(int y,int m,int d);
	void showDate();
};

Date::Date(int y = 2017, int m = 3, int d = 8) :_year(y), _month(m), _day(d)
{
	cout << "Constcuting ..." << endl;
}

Date::Date(const Date &d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	cout << "拷贝构造函数" << endl;    
}

void Date::setDate(int y, int m, int d)
{
	_year = y;
	_month = m;
	_day = d;
}

inline void Date::showDate()
{
	cout << _year << "." << _month << "." << _day << endl;
}

Date newSetdate(Date &d)
{
	Date tmp;                   //这里函数被调用,首先调用构造函数,并且自动赋初值,实例化了一个新的对象tmp
	return tmp;                 //这返回tmp的时候,没有直接把内容进行返回,而是返回tmp的一份拷贝,所以这里调用了拷贝构造函数
}

int main()
{
	Date date1(2017,3,7);         //首先调用构造函数
	date1.showDate();            //这里打印的结果是2.17,3,7  
	date1 = newSetdate(date1);   //这里首先调用的我的一个普通函数,大家可以先去这个普通函数中看一下
	date1.showDate();

	return 0;
}

这里给大家说一下调用拷贝构造函数的几种情况,一般情况下建议重写拷贝构造函数,防止出现深浅拷贝的问题。

(1)    当用类的一个对象去初始化类的另一个对象的时候

(2)    当函数的形参是类的对象,调用函数进行形参和实参结合时

(3)    当函数的返回值是对象,函数执行完成返回调用者时



拷贝构造函数(一定要看清楚到底什么时候调用拷贝构造函数) 1、拷贝构造函数是用一个已存在的对象去初始化另一个需要新建的对象,即用已经存在的对象初始化新建对象。 2、拷贝构造函数的写法类名 (const 类名 &amp;amp;要拷贝的类名) 例如: X是类的名称; X(const X &amp;amp;p) { a_=p.a_,b_=p.b_;//这里必须要有 } 2、使用拷贝构造函数的情形 (1) X (const X &amp;amp;p){} int... 阅读详情

相关推荐

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 710

简述:什么时候必须重写拷贝构造函数?

本博文源于C++基础,学完类与对象的这个章节后,发现有一道课后习题叫做“什么时候必须重写拷贝构造函数?”我好奇将答案进行抄写下来,如果有一天别人问起我,我可以脱口而出,岂不美哉!当然了,欢迎大家收藏!

执念斩长河 2480

从MIPS汇编到C语言:手把手教你用Mars模拟器理解指令集(附实战代码)

本文详细介绍了如何使用Mars模拟器从MIPS汇编过渡到C语言编程,通过实战代码解析ADD、LW、BEQ等指令集与C语言结构的对应关系。内容涵盖环境搭建、算术运算、内存访问、条件分支及函数调用等核心概念,帮助读者深入理解MIPS指令分类和计算机底层运行机制。

weixin_26821003的博客 357

C++拷贝构造函数

#include <iostream> using namespace std; /* 二个特殊的构造函数 1)默认无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且 其函数体为空 2)默认拷贝构造函数 当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函 数,简单的进行成员变量的值复制 */ class Test { public: Test() { cout << "无参构造" << endl; } Te.

p=f/s 402

从代码层面分析STM32 标准库和HAL库的差异

相当于每个设置都是独立的函数。HAL库将一段代码通过宏定义的方式封装成了一个函数,每个端口的时钟都单独的定义了一个名称,标准库是一个独立的函数,通过参数传递的方式来设置每个端口的时钟。这两个版本的函数本质上操作的还是寄存器,不过HAL库操作的只是BSRR寄存器,而标准库端口置1的时候操作的是BSRR寄存器,端口清0的时候操作的是BRR寄存器。标准库设置端口模式的时候,是在if语句中判断之后直接设置的,而HAL端口模式设置时,却使用了switch语句去设置,说明在HAL库中,端口模式和标准库中发生了改变。

HXYDJ的博客 2万+

2025小红书跳转卡片实战指南:从零搭建独立后台与自动化发卡系统

本文提供了一份2025年小红书跳转卡片的实战搭建指南,详细解析了独立后台系统的核心架构与自动化发卡流程。文章从零开始,手把手教你使用Node.js、Vue.js等技术栈构建包含后台管理、用户制卡中心与前端交互的完整系统,旨在帮助运营者实现合规引流,并掌握数据自主权与自动化运营能力。

weixin_29234423的博客 516

函数中返回局部对象,但是没有调用拷贝构造函数?!

class Person { public: Person() : age(10) { std::cout << "Person construct" << std::endl; } Person(const Person & p) { ...

baidu_41692782的博客 1467

新华硕笔记本ubuntu18.04双系统安装之后,wifi没有显示无法链接wifi

本来我以为跟简单安装一个wifi网卡的驱动就可以解决的问题,没想到花了我一早上的时候解决… 惭愧。 另外,本来是没打算写这篇博客的,但是我在搜索解决这个问题的过程中, 发现多人提出的解决方案跟我的都不一样,甚至我的解决方案都没有搜到相应的答案,还是只能靠自己啊。。 言归正传,还是说说怎么正确的安装wifi驱动吧! 1. wifi没有正确安装、或没有正确配置的表现 我的电脑现象: 有wifi图标, wifi设置上显示unaviable,无法搜索到任何wifi; 还有其他类似的表现,大家可以看看其他朋友的提

Ian的博客 1889

C++探讨 一: 函数返回值为类对象和类对象引用

C++ 中函数返回值为类对象的研究

U__F__O 7137

7、初级视觉皮层(V1)的研究综述

本文综述了初级视觉皮层(V1)的基本功能特性、计算理解、细胞相互作用及理论模型。V1不仅执行方向和空间频率的选择性滤波,还通过相位选择性和上下文调制参与高级视觉处理。研究从信息编码角度解释了V1感受野的形成,并介绍了基于自然图像统计的建模方法。横向与反馈连接揭示了V1在全局视觉整合中的作用,尤其是上下文对细胞响应的快速调节。李的动态模型提出V1可生成视觉显著性图,支持前注意分割和注意力引导。未来研究聚焦于V1在注意力、意识和硬件实现中的潜在应用,推动视觉神经科学与人工智能的交叉发展。

7z8x2c4v6b9的博客 144

SAP CAP 编程模型简介

官网 CAP 是用于构建企业级服务和应用程序的语言、库和工具框架。它引导开发人员沿着经过验证的最佳实践和大量现成的解决方案来应对重复性任务的“黄金之路”。 基于 CAP 的项目受益于对领域的主要关注。我们没有深入研究过于技术性的学科,而是专注于在快速变化的云技术世界中加速开发和保护投资。 CAP 框架融合了经过验证和广泛采用的开源和 SAP 技术,如下图所示。 在开源技术之上,CAP主要增加了: 核心数据服务 (CDS) 作为我们用于域模型和服务定义的通用建模语言。 用于 Node.js 和 Ja

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1545

C++,当函数参数或者返回值是对象......(★firecat推荐★)

C++,当函数参数或者返回值是对象

pingis58的博客 344

OCS2 入门教程(一)

OCS2 是专为切换系统优化控制(ptimalontrol forwitchedystems,OCS2)定制的 C++ 工具箱。该工具箱提供以下算法的高效实现:SLQ:连续时间域约束 DDPiLQR:离散时域约束 DDPSQP:基于 HPIPM 的多重打靶算法IPM: 基于非线性内点法的多重搜索算法SLP:基于 PIPG 的顺序线性规划算法OCS2 通过增强拉格朗日法(Augmented Lagrangian)或松弛障碍法(relaxed barrier methods)处理一般路径约束。

机器人控制与仿真应用 7836

C++拷贝构造函数以及对象的使用

C++拷贝构造函数以及对象的使用

nnan77的博客 1714

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入篇【C++】类与对象:拷贝构造函数详解

深入篇【C++】类与对象:拷贝构造函数详解,带你了解更全面的C++!!!

Extreme_wei的博客 1805

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

什么时候必须重写拷贝构造函数

1、这里有个简单的规则:如果你需要定义一个非空的析构函数,那么,通常情况下你也需要定义一个拷贝构造函数。 2、有一个原则:一般来说你在类中进行了new操作,你就需要析构函数,在你需要析构函数的类中,一般需要加上挎贝构造函数和赋值函数。 3、拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函...

weixin_41066529的博客 4123

C++提高:拷贝构造函数

文章目录拷贝构造函数里能调用 private 成员变量吗?一个类中可以存在多于一个的拷贝构造函数吗?调用拷贝构造函数的情形1. 一个对象作为函数参数,以值传递的方式传入函数体2. 一个对象作为函数返回值,以值传递的方式从函数返回3. 一个对象用于给另外一个对象进行初始化(常称为赋值初始化) 拷贝构造函数里能调用 private 成员变量吗? 解答:拷贝构造函数其时就是一个特殊的构造函数,操作的还是自己类的成员变量,所以不受 private 的限制。 一个类中可以存在多于一个的拷贝构造函数吗? 解答:类中可以

流楚丶格念的博客 3088

C++类和对象 ——构造函数

本篇博客深入的讲解了c++类和对象中的拷贝构造是什么,设计拷贝构造函数需要注意什么点,以及什么是默认拷贝构造函数和为什么需要自定义拷贝构造函数,最后列出了什么时候会调用拷贝构造函数以及拷贝构造函数哪些时候不需要自己显式定义。

weixin_72883322的博客 666

拷贝构造函数

拷贝构造函数

liu_xinLL的博客 190

c++中拷贝构造函数的使用时机以及实例分析

c++中拷贝构造函数的理解

m0_45172994的博客 516

第006课 C++ 构造函数_析构函数_拷贝构造函数

3、在类中,若定义了没有参数的构造函数,或各参数均有缺省值的构造函数也称为缺省的构造函数,缺省的构造函数。如果定义的类仅用于派生其它类时,则可将构造函数定义为保护的成员函数。对象时,调用构造函数的,且由于对象一直存在,只调用一次构造函数。私有数据成员、保护的数据成员和公有的数据成员均能进行初始化。是完成初始化对象的数据成员以及其它的初始化工作。缺省的构造函数并不对所产生对象的数据成员赋初值。构造函数提供了初始化对象的一种简单的方法。5.若定义的类要说明该类的对象时,,以便完成初始化对象的数据成员。

W_Linux220的博客 1101

C++类和对象练习

C++上机练习复习

fzy2003的博客 3596

C++ 拷贝构造函数

拷贝构造函数是一种特殊的构造函数,具有单个形参。 必须定义拷贝构造函数的情况: 1.如果类带有指针变量,或者有动态内存分配,则必须定义一个拷贝构造函数。 2.只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义拷贝构造函数也可以拷贝;如果在类中没有定义拷贝构造函数,编译器会自行定义一个。 什么情况使用拷贝构造函数: 类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会...

张威的博客 302

C++ 】类的6个默认成员函数1( 构造、析构、拷贝构造函数)

类的6个默认成员函数 之前说,如果一个类中的什么成员都没有,就称为空类。其实,并不是这样的,任何一个类在我们什么都不写的情况下,都会自动生成6个默认成员函数。 1.构造函数 构造函数是一个特殊的成员函数,因为,构造函数的名称虽然是构造,但要注意构造函数的主要任务并不是开空间创建对象,而是初始化对象。(可以在创建对象时直接初始化) 特征: 1.函数名与类名相同 2.无返回值 3.对象实例化时编译器...

weixin_43219708的博客 1272

c++ 拷贝构造函数

拷贝构造函数: 是一种特殊的构造函数,它由编译器来调用来完成一些基于同一类的其他对象的构建及初始化。     什么时候要调用拷贝构造函数(复制构造函数)?        1)  一个对象作为函数参数,以值传递的方式传入函数体.        2)  一个对象作为函数返回值,以值传递的方式从函数返回。        3)  一个对象用于给另外一个对象进行初始化(常称为复制初始化)。

zhangfulin_hwatop的专栏 448

拷贝构造函数详解及存在的一些问题

d1传值给date′时,date′又要调动拷贝构造获得d1的值,此时date′调用拷贝构造,d1传值给date′′。d1传值给形参date时,date要调动拷贝构造获得d1的值,此时date调用拷贝构造,d1传值给date′。1. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定。字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

start_fall的博客 396
上一篇: C++构造函数和析构函数
下一篇: C++运算符重载
NeilZhy
博客等级 码龄11年 175粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值