【深入理解C++】调用父类的拷贝构造函数

2023-11-05

1.默认的拷贝操作

默认情况下,继承体系下类对象的拷贝是每个成员变量逐个拷贝。

#include <iostream>
using namespace std;

class Person
{
private:
	int m_age;
public:
	Person(int age = 0) : m_age(age)
	{
		cout << "调用了Person的构造函数" << endl;
	}
};

class Student : public Person
{
private:
	int m_score;
public:
	Student(int age = 0, int score = 0) : Person(age), m_score(score)
	{
		cout << "调用了Student的构造函数" << endl;
	}
};

int main()
{
	Student stu1(18, 100);
	Student stu2(stu1);

	return 0;
}

输出结果如下:

在这里插入图片描述

汇编代码如下:

在这里插入图片描述

2.调用父类的拷贝构造函数

如下代码所示,可以在子类中自定义拷贝构造函数,并在初始化列表中调用父类的拷贝构造函数为父类部分的成员变量赋值。

#include <iostream>
using namespace std;

class Person
{
private:
	int m_age;
public:
	Person(int age = 0) : m_age(age)
	{
		cout << "调用了Person的构造函数" << endl;
	}

	Person(const Person& person) : m_age(person.m_age)
	{
		cout << "调用了Person的拷贝构造函数" << endl;
	}
};

class Student : public Person
{
private:
	int m_score;
public:
	Student(int age = 0, int score = 0) : Person(age), m_score(score)
	{
		cout << "调用了Student的构造函数" << endl;
	}

	Student(const Student& student) : Person(student), m_score(student.m_score)
	{
		cout << "调用了Student的拷贝构造函数" << endl;
	}
};

int main()
{
	Student stu1(18, 100);
	Student stu2(stu1);

	return 0;
}

输出结果如下:

在这里插入图片描述

如果 Student 的拷贝构造函数没有调用父类的拷贝构造函数,即只给 m_score 赋值而不管 m_age,会发生什么现象?

答:因为子类的构造函数会默认调用父类的无参构造函数,所以 m_age0 而不是 0xCC

#include <iostream>
using namespace std;

class Person
{
private:
	int m_age;
public:
	Person(int age = 0) : m_age(age)
	{
		cout << "调用了Person的构造函数" << endl;
	}

	Person(const Person& person) : m_age(person.m_age)
	{
		cout << "调用了Person的拷贝构造函数" << endl;
	}
};

class Student : public Person
{
private:
	int m_score;
public:
	Student(int age = 0, int score = 0) : Person(age), m_score(score)
	{
		cout << "调用了Student的构造函数" << endl;
	}

	Student(const Student& student) : m_score(student.m_score)
	{
		cout << "调用了Student的拷贝构造函数" << endl;
	}
};

int main()
{
	Student stu1(18, 100);
	Student stu2(stu1);

	return 0;
}

输出结果如下:

在这里插入图片描述

汇编代码如下:

在这里插入图片描述

3.用子类对象初始化父类对象

用派生类对象初始化基类对象时,只有该派生类对象的基类部分会被拷贝,派生类部分将会被忽略掉。

#include <iostream>
using namespace std;

class Person
{
private:
	int m_age;
public:
	Person(int age = 0) : m_age(age)
	{
		cout << "调用了Person的构造函数" << endl;
	}

	Person(const Person& person) : m_age(person.m_age)
	{
		cout << "调用了Person的拷贝构造函数" << endl;
	}
};

class Student : public Person
{
private:
	int m_score;
public:
	Student(int age = 0, int score = 0) : Person(age), m_score(score)
	{
		cout << "调用了Student的构造函数" << endl;
	}

	Student(const Student& student) : Person(student), m_score(student.m_score)
	{
		cout << "调用了Student的拷贝构造函数" << endl;
	}
};

int main()
{
	Student stu(18, 100);
	Person person(stu); // 此处会调用Person的拷贝构造函数。但是Person作为基类,它只能处理基类自己的成员,无法处理派生类中的成员。

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

【深入理解C++】调用父类的拷贝构造函数 的相关文章

  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • 解决cv2没有face模块

    人脸识别报错解决 AttributeError module cv2 cv2 has no attribute face 人脸识别报错如下 AttributeError module cv2 cv2 has no attribute fac
  • Scrapy介绍及入门

    一 Scrapy简介 Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 可以应用在包括数据挖掘 信息处理或存储历史数据等一系列的程序中 其最初是为了页面抓取 更确切来说 网络抓取 所设计的 也可以应用在获取API所返回的数
  • 面试官:SPA(单页应用)首屏加载速度慢怎么解决?

    一 什么是首屏加载 首屏时间 First Contentful Paint 指的是浏览器从响应用户输入网址地址 到首屏内容渲染完成的时间 此时整个网页不一定要全部渲染完成 但需要展示当前视窗需要的内容 首屏加载可以说是用户体验中最重要的环节
  • wps没有卸载干净怎么解决_WPS云文档链接分享后对方没有访问权限?解决办法在此...

    互联网时代的办公 当然也离不开网络 当下盛行远程办公 大家可以随时随地办公 实时分享工作进度非常的方便 要想远程办公最离不开的应该就是云文档 只要登录同一个账号 大家可以共同编辑同一个文档 也可以分享给其他人来实现实时共享工作进度 以及稳当
  • 自从我这样撸代码以后,公司网页的浏览量提高了107%!

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯IVWEB团队 发表于云 社区专栏 作者 yangchunwen HTTP协议是前端性能乃至安全中一个非常重要的话题 最近在看 web性能权威指南 High Perform
  • Cisco Packet Tracer 实验:生成树配置

    实验目的 1 理解广播风暴的成因 2 掌握STP和RSTP原理及配置方法 实验内容 实验描述 学校为了开展计算机教学和网络办公 建立的一个计算机教室和一个校办公区 这两处的计算机网络通过两台交换机互联组成内部校园网 为了提高网络的可靠性 作
  • Navicat Premium 连接 MySQL 8.0 报错“1251”分析解决

    人闲太久 努力一下就以为是在拼命 一 问题 Navicat Premium 连接 MySQL 8 0 报错 1251 Client does not support authentication protocol requested by
  • 如何自定义sort函数中的比较函数

    在做剑指offer时 有一道题 题目描述 输入一个正整数数组 把数组里所有数字拼接起来排成一个数 打印能拼接出的所有数字中最小的一个 例如输入数组 3 32 321 则打印出这三个数字能排成的最小数字为321323 思路 自定义比较器 若a
  • TensorFlow在MNIST中的应用-无监督学习-自编码器(autoencoder)和encoder

    参考 TensorFlow技术解析与实战 TensorFlow上实现AutoEncoder自编码器 前面讲到的都是有监督学习 他的重要特征是数据都是有标记的 无标记的数据应该用什么样的网络模型来学习呢 这里用一个叫做 自编码网络 的网络模型
  • 同步和异步的区别

    同步 进程之间的关系不是相互排斥临界资源的关系 而是相互依赖的关系 进一步的说明 就是前一个进程的输出作为后一个进程的输入 当第一个进程没有输出时第二个进程必须等待 具有同步关系的一组并发进程相互发送的信息称为消息或事件 其中并发又有伪并发
  • c语言如何判断数据是否符合正态分布_统计学-1:判断数据是否满足正态分布

    1 正态分布的定义 正态分布 The Normal Distribution 假设一随机变量X服从一个期望为 方差为 的正态分布 概率密度函数为 则可记为 import 1 正态分布为什么常见 真正原因是中心极限定理 Central Lim
  • Linux 的性能调优的思路

    Linux操作系统是一个开源产品 也是一个开源软件的实践和应用平台 在这个平台下有无数的开源软件支撑 我们常见的apache tomcat mysql等 开源软件的最大理念是自由 开放 那么Linux作为一个开源平台 最终要实现的是通过这些
  • offset client style 之间的区别

    offset 返回一个指向最近的 closest 指包含层级上的最近 包含该元素的定位元素 如果没有定位的元素 则 offsetParent 为最近的 table元素对象或根元素 标准模式下为 html quirks 模式下为 body 父
  • 【状态估计】电力系统状态估计的虚假数据注入攻击建模与对策(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 文献分享阅读 我用夸克网盘分享了
  • mysql alter字段,mysql alter 语句用法,添加、修改、删除字段

    mysql alter 语句用法 添加 修改 删除字段 主键 alter table tabelname add new field id int 5 unsigned default 0 not null auto increment a
  • Spark报错解决:org.apache.spark.SparkException: Task failed while writing rows.at org.apache.spark.sql.ex

    文章目录 报错信息 解决方法 报错信息 报错信息很长 这里截取了最先的一个错误信息 发现是写入文件时出错 Caused by org apache spark SparkException Job aborted due to stage
  • 数仓 面试题(离线)实战解答

    无意间翻到以前的数仓面试题 今天把它整理出来 方便你我他 数仓分层 为什么要对数仓进行分层 1 说说对数据仓库的理解 数据仓库是面向主题进行组织的 数据是集成的 不可更新的 随时间变化的的 数据仓库经历了这样三个阶段 简单报表阶段 数据集市
  • Go语言中如何在range循环中修改数组/切片内容

    在go语言中 我们经常会使用到range来帮助我们遍历一些数据 通常情况下都是查看操作多一些 但是当我们需要对其原地址上的内容进行变更时 通常都是使用 for i 0 i
  • mac下统计代码行数方法

    使用cloc工具统计 1 首先在终端执行命令下载cloc brew install cloc 没有brew的先下载brew 这个后面写一个 这里先占位 2 cloc使用 进入想要查询的项目文件夹 然后执行下面的命令查询 cloc 如下图所示
  • 【深入理解C++】调用父类的拷贝构造函数

    文章目录 1 默认的拷贝操作 2 调用父类的拷贝构造函数 3 用子类对象初始化父类对象 1 默认的拷贝操作 默认情况下 继承体系下类对象的拷贝是每个成员变量逐个拷贝 include