c++ 学习之 构造函数的使用

2023-10-30

上代码

class person
{
public:
	person()
	{
		cout << " person 的无参默认构造函数 " << endl;
	}
	person(int age)
	{
		cout << " person 的有参默认构造函数 " << endl;
		m_age = age;
	}
	person(const person& other)
	{
		cout << " 调用拷贝构造函数 " << endl;
		m_age = other.m_age;
	}
	~person()
	{
		cout << " person 的析构函数 " << endl;
	}

private:
	int m_age;
};

// 拷贝构造函数调用时机

// 1.使用一个已经创建完毕的对象来初始化一个新的对象
void test01()
{
	person p1(20);
	person p2(p1);
}


// 2.值传递的方式给函数参数传值
void doWork(person p)   // 这是值传递
{

}
void test02()
{
	person p;
	doWork(p);
}
// 3.值方式返回局部对象

person doWork2()  
{
	person p1;   // 创建在栈,这个函数结束的时候内存被回收
	return p1;   //  返回的其实是拷贝构造
}

int main()
{
	test01();
	test02();
	doWork2();
}

正文

在上面的代码中,定义了一个名为person的类,并实现了默认构造函数、有参构造函数、拷贝构造函数以及析构函数。然后,使用不同的方式调用了拷贝构造函数,让我们逐步解释拷贝构造函数的作用和调用时机:

使用一个已经创建完毕的对象来初始化一个新的对象(test01函数):

person p1(20);  // 创建一个p1对象,并使用有参构造函数初始化
person p2(p1);  // 使用p1对象来初始化p2对象,这里调用了拷贝构造函数

这里拷贝构造函数的作用是将已经存在的对象(p1)的属性值复制给新创建的对象(p2)。这是通过对象的初始化来触发的拷贝构造函数调用。

值传递的方式给函数参数传值(test02函数):

void doWork(person p) {
    // 函数内部,创建了一个person对象p,使用拷贝构造函数将传入的p复制到局部对象p中
}
void test02() {
    person p;
    doWork(p);  // 通过值传递方式将p传递给doWork函数,这里也会触发拷贝构造函数的调用
}

当你调用doWork函数时,将一个person对象作为参数传递,实际上会触发拷贝构造函数的调用,将传递的对象复制到函数内部的局部对象中。

值方式返回局部对象(doWork2函数):

person doWork2() {
person p1; // 创建在栈上的局部对象
return p1; // 返回局部对象,这里也会触发拷贝构造函数的调用
}
在doWork2函数内部,你创建了一个person对象p1,然后尝试返回它。由于p1是一个局部对象,当函数返回时,它会被销毁。但在返回时,会触发拷贝构造函数的调用,将p1的副本返回给调用者。

总之,拷贝构造函数的主要作用是用于对象的复制操作,无论是通过初始化新对象、值传递参数还是返回局部对象,都可能触发拷贝构造函数的调用,以确保新对象与原对象具有相同的属性值。这对于在不同作用域中共享对象的副本以及确保对象的正确复制非常重要。同时,要注意在拷贝构造函数中,通常需要深拷贝对象的资源,以避免资源共享问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 学习之 构造函数的使用 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • 配置 Nginx 错误和访问日志

    Nginx 是一个开源的 高性能的 HTTP 和反向代理服务器负责处理互联网上一些最大网站的负载 管理时NGINX对于 Web 服务器 您将执行的最常见的任务之一是检查日志文件 了解如何配置和读取日志在排除服务器或应用程序问题时非常有用 因
  • 如何在 Debian 10 Linux 上安装 VirtualBox 来宾添加

    虚拟盒子是一款开源 跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 VirtualBox 提供了一组可以安装在来宾操作系统中的驱动程序和应用程序 VirtualBox Guest Additions 来宾添加为来宾计算机提供了多种
  • 【JS 逆向百例】百度翻译接口参数逆向

    文章目录 逆向目标 逆向过程 抓包分析 获取 token 获取 sign 完整代码 baidu encrypt js baidufanyi py 逆向目标 目标 百度翻译接口参数 主页 https fanyi youdao com 接口 h
  • 查看: 1280

    查看 1280 回复 0 电容三点式LC振荡器电路组成及工作原理简述 复制链接 husk2012 95 主题 0 听众 3189 积分 VIP会员 收听TA 发消息 电梯直达
  • line-height:1是什么意思

    line height 1是什么意思 其实仍旧是设置行高的一种方法 只不过简化了语句 举个例子 比如此时你设置了font size 20px 之后你设置了line height 1 转义过来的意思就是line height 20px 行高为
  • 傻瓜式-根据自定义规则编码生成

    private final ReentrantLock lock new ReentrantLock public Result addProvider Provider proNew new Provider try lock lock
  • c语言ox是什么意思啊,ox什么意思

    营销树今天精心准备的是 ox什么意思 下面是详解 OX是什么意思 OX是无色透明的化学液体邻二甲苯的英文简写 OX作为英文单词是可数名词 基本含义是牛 读音为 英 ks 美 ks 复数 oxen 同义词 wild ox 例句They are
  • 福大计算机学硕扩招,福州大学2021年推免数据,快来了解这所211大学的保研情况!...

    福州大学是省部共建高校 是 双一流 建设高校 是 211工程 建设高校 学校现有1个国家重点实验室 8个国家级工程研究中心 3个国家国际科技合作基地 3个教育部重点实验室 有11个博士后科研流动站 11个一级学科博士点 2021年推荐优秀应
  • Arthas开源一周年,Github Star 160K,我们一直在坚持什么?

    缘起 最近看到一个很流行的标题 开源XX年 star XXX 我是如何坚持的 看到这样的标题 忽然发觉Arthas从2018年9月开源以来 刚好一年了 正好在这个秋高气爽的时节做下总结和回顾 Arthas Arthas是Alibaba开源的
  • WSL2创建多实例--发行版管理工具wsl2distromanager使用

    简介 wsl2 distro manager是github上的一款WSL的开源实例管理工具 它具有GUI界面 是目前我发现的比较方便的管理工具 项目地址如下 https github com bostrot wsl2 distro mana
  • 氮化镓 服务器电源管理系统报价,基于氮化镓的电源解决方案总体拥有成本评估...

    引言 近年来 电信市场正在朝云计算的方向转变 这导致超大规模数据中心空前快速的增长 而每个机架需要处理的功能也越来越多 反过来 这种趋势也意味着对功率的需求快速增加 而重点则是采用消耗更少电力的更高效 体积更紧凑的电源 散热同样是这里需要考
  • 信息安全保障体系规划方案

    本文转载自公众号爱方案 ID ifangan 本文内容为信息安全技术体系 运维体系 管理体系的评估和规划 是信息安全保障体系的主体 一 概述 1 1引言 本文基于对XX公司信息安全风险评估总体规划的分析 提出XX公司信息安全技术工作的总体规
  • C语言实战例题:必会的 10 个C语言经典练习题,源码分享

    这些都是基本的 C 程序 可以帮助刚踏入 C 编程世界的新手 快来试试吧 1 C 语言编程 Hello World include
  • 虚拟服务器磁盘 厚置备置零,VMware ESXi 虚拟硬盘格式记录:厚置备延迟置零、厚置备置零、精简置备...

    创建磁盘时 会进行两个操作 分配空间 置零 1 厚置备延迟置零 默认的创建格式 创建磁盘时 直接从磁盘分配空间 但对磁盘保留数据不置零 所以当有I O操作时 只需要做置零的操作 磁盘性能较好 时间短 适合于做池模式的虚拟桌面 2 厚置备置零
  • 微信小程序授权登录流程

    自我介绍 我是IT果果日记 微信公众号请搜索 IT果果日记 一个普通的技术宅 定期分享技术文章 欢迎点赞 关注和转发 请多关照 首先 我们要了解什么是微信小程序登录 它的作用是什么 用户登录 微信小程序登录是为了让开发者的服务器获取用户的o
  • MySQL主从复制实现读写分离

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 读写分离 1 1 多台数据库 1 2 MySQL
  • Java集合框架图析(Collection-List)

    Java集合框架图析 Collection List 前言 Java 集合 也称作容器 主要是由两大接口 Interface 派生出来的 Collection 和 Map 顾名思义 容器就是用来存放数据的 那么这两大接口的不同之处在于 Co
  • Android 指纹识别(给应用添加指纹解锁)

    使用指纹 说明 指纹解锁在23 的时候 官方就已经给出了api 但是由于Android市场复杂 无法形成统一 硬件由不同的厂商开发 导致相同版本的软件系统 搭载的硬件千变万化 导致由的机型不支持指纹识别 但是 这也挡不住指纹识别在接下来的时
  • nmake编译Qt第三方库出现无法打开包含文件type_traits

    最近需要为个人项目ShaderLab添加内嵌的代码编辑窗口功能 支持语法高亮和Intellisense 最初使用了QCodeEditor 发现这个第三方的库对词法分析的实现效果不太行 代码换行后直接缩进到首行 无法定位到前一句的首行 考虑换
  • c++ 学习之 构造函数的使用

    上代码 class person public person cout lt lt person 的无参默认构造函数 lt lt endl person int age cout lt lt person 的有参默认构造函数 lt lt e