c++学习笔记二十——派生类的构造函数,复制构造函数和析构函数

2023-11-03

在讲派生类的构造和析构函数时候我们先介绍类的兼容性。
类的兼容性:
类的兼容性是指在需要基类对象的任何地方都可以使用派生类来替代,通过继承,派生类得到了除了基类构造函数,复制函数中的所有成员。这样公有派生类实际具备了基类所有的功能,凡是基类所能解决的问题,公有派生类都可以解决。类的兼容性规则中所指代的情况有以下几种
1)派生类的对象可以隐含转化为基类对象
2)派生类对象可以初始化基类的应用
3)派生类的指针可以初始化基类的指针
在替代之后,派生类对象可以作为基类对象使用,但只能使用从基类继承的成员。
派生类的构造和析构函数
继承的目的是为了发展,派生类继承了基类的成员,实现原有代码的重用,这只是一部分,类的派生只有通过添加新的成员,加入新的功能,类的派生才有实际意义。
构造函数
定义了派生类以后,要使用派生类就需要声明该类的对象,对象在使用之前必须进行初始化。派生类的对象是由所有的基类成员对象与派生类新增成员对象共同组成。
因此在构造派生类对象时,就需要对基类的成员对象和新增成员对象初始化。基类的构造函数并没有继承下来,要完成这些工作就必须给派生类添加新的构造函数。派生类对于很多基类成员对象是不能够直接访问的,因此要玩车个对基类对象的初始化工作,需要调用基类的构造函数。构造函数的形式

派生类名::派生类名(参数表):基类名1(基类1初始化参数表),.....,基类名n(基类n初始化参数表),成员对象名1(成员对象1初始化参数表)
{
派生类构造函数的其他初始化操作;
}

下面说明什么时候要声明派生类的构造函数。如果对基类初始化时,需要调用基类的带有形参表的构造函数时,派生类就必须声明构造函数。
派生类构造函数执行次序一般如下:
1)调用基类构造函数,调用顺序按照他们被继承时声明的顺序。
2)对派生类新增成员进行对象的初始化,调用的顺序按照他们被继承时声明的顺序(从左向右)。
3)执行派生类的构造函数体中的内容。
下面进行举例

#include<iostream>
#include<string>
#include"rectangle.h"

using namespace std;
//基类base1
class base1
{
public:
	base1(int j){ cout << "base1" << endl; }
    
};
//基类base2
class base2
{
public:
	base2(int i) { cout << "base2" <<" " <<i<< endl; }

};
//基类base3
class base3
{
public:
	base3() { cout << "base3" << endl; }
};
//派生类
class rui:public base1 ,public base2,public base3
{ public:
	rui(int a, int b, int c):test1(a), test2(b),base1(a), base2(b){
		cout << "rui called" << endl;
	}
private:
	base1 test1;
	base3 test3;
	base2 test2;
};
int main()
{
	rui test1(0,2,3);

}

运行结果如下:
在这里插入图片描述
以上我们可以看到函数的构造顺序。下面介绍复制构造函数。
如果程序员没有编写复制构造函数时,那么编译系统会在必要时编写一个默认复制构造函数,如果需要为派生类编写复制构造函数,一般需要给基类的复制构造函数传递参数。复制构造函数的基本语句为

派生类(派生类名 &v1):基类(v1)
{...}

我们知道,对于基类的复制构造函数来说,我们应该使用基类的引用,但是我们在上文类的兼容性提出到可以使用派生类代替基类的引用,因此参数也可以为派生类。上面的构造函数注意深复制与浅复制的问题,如果想要完全进行地址的复制需要进行动态内存分配,下面我简单编写一个例子使得大家能够轻松理解使用方式,定义了一个基类,和一个派生类,并定义了一些外部的接口,代码如下:

#include<iostream>
#include<string>
using namespace std;
//基类
class girl
{
private:
	//个人信息
	string  name;
	int    height;
	int     age;
	int    weight;
public:
//外部接口
	int getheight() { return height; }
	int getage() { return age; }
	int getweight() { return weight; }
	string getname() { return name; }
	//改变年龄
	void change(int agea) {
		age = agea;
	}
	//构造函数
	girl(string name1="zhang", int height1=178, int age=23, int weight=60):name(name1), height(height1), age(age), weight(weight)
	{
		
		cout << "girl is called" << endl;
	}
};

//派生类
class rui:public girl {
private:
	//组合类可以但是继承类不可以,因为会被初始化两次
	//girl * girls;
	int *girls;
public:
	//构造函数
	rui(string name, int height, int age, int weight,int  & girls1): girl(name, height, age, weight)
	{
		girls = girls;
	}
	//复制构造函数
	rui(rui & v1) :girl(v1) {
	//动态内存分配,可以进行深复制
		girls = new int ;
		girls = v1.girls;
		
		cout << "called copy " << endl;
		
	}
	~rui()
	{   //析构函数释放内存
		cout << "delete" << endl;
		delete girls;
	}

    //接口,其实也可以在类外通过对象名.成员名来显示
	void girl1height() { cout << "女孩的身高"<<getheight(); }
};




int main()
{
	girl girl1;
	int girls =1;
	//初始化寒素
	rui test( "zhang",4165, 23, 60, girls);
	cout << test.getage() << endl;

	rui test1(test);
	cout << test1.getage() << endl;
	//测试复制构造函数
	test.change(3);
	cout << test.getage() << endl;
	cout << test1.getage() << endl;



}

析构函数
析构函数一般用来释放内存。对于动态内存,记得释放。

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

c++学习笔记二十——派生类的构造函数,复制构造函数和析构函数 的相关文章

  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 特斯拉传记--摘要

    参考 https baike baidu com item E5 B0 BC E5 8F A4 E6 8B 89 C2 B7 E7 89 B9 E6 96 AF E6 8B 89 4481228 fr aladdin 尼古拉 特斯拉 Nik
  • python flask自定义404错误页面

    在用浏览器访问url的时候 如果url不正确会报404错误 默认的404错误太枯燥了 这里我讲述一下如何将404错误页面修改为好看的404页面 1 首先 创建一个我们希望当出现404错误时展示的html页面 这里我随便写一个页面内容不多定义
  • Linux_centos7_文件与目录管理_指令与文件搜寻_(4)_(bird_bro)

    kingarthur localhost pwd home kingarthur Desktop Documents Downloads Music Pictures Public README README 1 README 2 READ
  • 漫话拥塞控制:BBRv3 来啦

    周一 2023 07 31 临近午夜刚准备睡觉 收到 bbr dev 一封邮件 贴出 IETF CCWG 大会链接 IETF117 CCWG 20230725 2200 以及 bbr3 幻灯片 BBRv3 Algorithm Bug Fix
  • android开发三大框架!Android架构师教你如何突破瓶颈,Android篇

    安卓开发大军浩浩荡荡 经过近十年的发展 Android技术优化日异月新 如今Android 11 0 已经发布 Android系统性能也已经非常流畅 可以在体验上完全媲美iOS 但是 到了各大厂商手里 改源码 自定义系统 使得Android
  • c语言 静态函数和普通函数的区别是什么,类函数和普通函数区别 成员函数和普通函数的所有区别...

    1 成员函数和普通函数的所有区别 区别很大 1 成员函数是面向对象的概念 所谓的成员函数 是指一个函数作为类的成员 公有成员 私有成员或者保护成员 2 普通函数一般有两种传递方式 按类型传递和按值传递 也就是传指针和传返回值两种情况 成员函
  • linux----使用rm -rf 删除大文件后磁盘空间并未释放的解决办法

    原文链接 linux 使用rm rf 删除大文件后磁盘空间并未释放的解决办法 1 问题 当发现linux系统中存在大文件 磁盘空间快满了后 一般会使用rm rf xxx 将大文件删除 但是删除后通过df h 发现磁盘空间并未释放 2 解决办
  • React中实现流程图(第三方库)

    React简单实现可拖拽流程图 下载第三方库 react flow yarn add react flow 准备两个文件 1 index tsx 组件入口 2 mock js 测试数据 index tsx文件代码 index js impo
  • Java 根据经纬度 角度 距离求另一个点坐标

    度换成弧度 param Float d 度 return Float 弧度 private static double rad double d return d Math PI 180 0 弧度换成度 param Float x 弧度 r
  • file_include(攻防世界)

    使用php filter 发现不行 猜测应该被过滤了 继续尝试 发现read base64 encode等关键字符被过滤了 了解到php中有两种转换器 发现string被过滤 只能使用convert了 convert 过滤器支持conver
  • Android异常:android.os.NetworkOnMainThreadException

    Android 4 1项目 使用新浪微博分享时报 android os NetworkOnMainThreadException 网上搜索后知道是因为版本问题 在4 0之后在主线程里面执行Http请求都会报这个错 也许是怕Http请求时间太
  • ReferenceError: fetch is not defined

    在使用fetch时 报错fetch is not find 根据https stackoverflow com questions 48433783 referenceerror fetch is not defined的回答 通过安装 使
  • 开源介绍

    一 什么是开源 开源 Open Source 开放源码 被非赢利软件组织 美国的Open Source Initiative协会 注册为认证标记 并对其进行了正式的定义 用于描述那些源码可以被公众使用的软件 并且此软件的使用 修改和发行也不
  • HDU - 1024 Max Sum Plus Plus(区间dp)

    区间dp 题意 在n个数里选出连续的m组数使其和最大 思路 dp i j 表示分i个组时前j个数的最大值 所以有递推方程dp i j max dp i 1 k w j dp i j 1 w j 其中k取1 2 3 j 1 把第j个数当做新的
  • 目标检测(三)损失函数

    目标检测 三 损失函数 开始 一 匹配策略 二 损失函数 三 Hard negative mining 总结 开始 内容参考 Datawhale Task03 化劲儿 损失函数设计 一 匹配策略 我们要想让其预测类别和目标框信息 我们先要知
  • 如何使用multipart/form-data格式上传文件

    有时 在网络编程过程中需要向服务器上传文件 Multipart form data是上传文件的一种方式 Multipart form data其实就是浏览器用表单上传文件的方式 最常见的情境是 在写邮件时 向邮件后添加附件 附件通常使用表单
  • Django安装操作教程

    一 环境准备 确保已安装好python和pycharm工具 二 django安装并配置环境变量 方法一 cmd中命令安装 pip install i https pypi douban com simple django 或 指定相应的dj
  • tr字符使用

    当我们把文件从Windows传到Linux环境时候 常常在每一行的末尾 会出现一些 M的字符 而这些字符会影响文件的正常读写和执行 要去掉这些 M 字符 有很多种办法 比如直接dox2unix 也可以使用一些命令去处理 比如 删除Windo
  • 406. Queue Reconstruction by Height

    class Solution public vector
  • c++学习笔记二十——派生类的构造函数,复制构造函数和析构函数

    在讲派生类的构造和析构函数时候我们先介绍类的兼容性 类的兼容性 类的兼容性是指在需要基类对象的任何地方都可以使用派生类来替代 通过继承 派生类得到了除了基类构造函数 复制函数中的所有成员 这样公有派生类实际具备了基类所有的功能 凡是基类所能