【深入理解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++】调用父类的拷贝构造函数 的相关文章

随机推荐

  • 解决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