C++类基础(十六)

news2024/9/24 5:23:47

类的继承——继承与特殊成员函数
● 派生类合成的……
– 缺省构造函数会隐式调用基类的缺省构造函数
– 拷贝构造函数将隐式调用基类的拷贝构造函数
– 赋值函数将隐式调用基类的赋值函数

struct Base
{
    Base()
    {
        std::cout << "Base()\n";
    }
    Base(const Base& val)
    {
        std::cout << "Base(const Base& val)\n";
    }
    Base& operator= (const Base&)
    {
        std::cout << "Base& operator= (const Base&)\n";
        return *this;
    }
};
struct Derive : Base
{
    //没有定义派生类的缺省构造函数,编译器自动合成了一个缺省构造函数
    //没有定义派生类的拷贝构造函数,编译器自动合成了一个拷贝构造函数
    //没有定义派生类的重载赋值运算符函数,编译器自动合成了一个重载赋值运算符函数
};
int main()
{
    Derive d;
    Derive x(d);
    x = d;
    return 0;
}

在这里插入图片描述

● 派生类的析构函数会调用基类的析构函数

struct Base
{
    Base()
    {
        std::cout << "Base()\n";
    }
    Base(const Base& val)
    {
        std::cout << "Base(const Base& val)\n";
    }
    Base& operator= (const Base&)
    {
        std::cout << "Base& operator= (const Base&)\n";
        return *this;
    }
    ~Base()
    {
        std::cout << "~Base()\n";
    }
};
struct Derive : Base
{
//    Derive() = default;
//    Derive(const Derive& val) = default;
//    Derive& operator= (const Derive&) = default;

};
int main()
{
    Derive d;
    return 0;
}

在这里插入图片描述

struct Base
{
    Base()
    {
        std::cout << "Base()\n";
    }
    Base(const Base& val)
    {
        std::cout << "Base(const Base& val)\n";
    }
    Base& operator= (const Base&)
    {
        std::cout << "Base& operator= (const Base&)\n";
        return *this;
    }
    ~Base()
    {
        std::cout << "~Base()\n";
    }
};
struct Derive : Base
{
    ~Derive()
    {
        std::cout << "~Derive()\n";
    }
};
int main()
{
    Derive d;
    return 0;
}

在这里插入图片描述

● 派生类的其它构造函数将隐式调用基类的缺省构造函数

struct Base
{
    Base()
    {
        std::cout << "Base()\n";
    }
    Base(int) //参数有明确的意义
    {
        std::cout << "Base(int)\n";
    }
    Base(const Base& val)
    {
        std::cout << "Base(const Base& val)\n";
    }
    Base& operator= (const Base&)
    {
        std::cout << "Base& operator= (const Base&)\n";
        return *this;
    }
    ~Base()
    {
        std::cout << "~Base()\n";
    }
};
struct Derive : Base
{
    Derive(int)
    {
        std::cout << "Derive(int)\n";
    }
    //Derive(const Derive&) = default; //隐式调用基类的缺省构造函数
    Derive(const Derive&) //自定义派生类拷贝构造函数,编译器最佳的选择是隐式调用基类的缺省构造函数,一些情况下可能不合理
    {
        std::cout << "Derive(const Derive&)\n";
    }
};
int main()
{
    Derive d(0);
    Derive x(d);
    return 0;
}

在这里插入图片描述

● 所有的特殊成员函数在显式定义时都可能需要显式调用基类相关成员

struct Base
{
    Base()
    {
        std::cout << "Base()\n";
    }
    Base(int input) //参数有明确的意义
    {
        std::cout << "Base(int)\n";
    }
    Base(const Base& val)
    {
        std::cout << "Base(const Base& val)\n";
    }
    Base& operator= (const Base&)
    {
        std::cout << "Base& operator= (const Base&)\n";
        return *this;
    }
    ~Base()
    {
        std::cout << "~Base()\n";
    }
};
struct Derive : Base
{
    Derive() //派生类的缺省构造函数包括三部分,第一部分: 声明
        : Base(0) //第三部分: 处理隐式的或者是显式的初始化列表
    {
        //第二部分: 不是初始化,是对已初始化好的内存进行赋值
    }
    
    //Derive(const Derive&) = default; //隐式调用基类的缺省构造函数
    Derive(const Derive& input)
           : Base(input)
    {
    }
    Derive& operator= (const Derive& val)
    {
        Base::operator=(val);
        return *this;
    }
};
int main()
{
    Derive d;
    Derive x(d);
    x = d;
    return 0;
}

在这里插入图片描述

● 构造与销毁顺序
– 基类的构造函数会先调用,之后才涉及到派生类中数据成员的构造

构造基类的时候不会依赖派生类的成员,而构造派生类的时候可能会依赖基类的成员

– 派生类中的数据成员会被先销毁,之后才涉及到基类的析构函数调用

#include<iostream>
using namespace std;
class Date
{
    int Year, Month, Day;
public:
    Date(int y = 2002, int m = 1, int d = 1)
    {
        Year = y; Month = m; Day = d;
        cout << "Constructor: ";
        ShowDate();
    }
    void ShowDate()
    {
        cout << Year << '.' << Month << '.' << Day << endl;
    }
    ~Date()
    {
        cout << "Destructor: ";
        ShowDate();
    }
};
void main()
{
    Date d1(2008, 1, 1);
    Date d2(2008, 2, 2);
    Date d3(2008, 3, 3);
}
Date d4(2008, 4, 4);
Date d5(2008, 5, 5);

在这里插入图片描述

#include<iostream>
using namespace std;
class Date
{
    int Year, Month, Day;
public:
    Date(int y = 2002, int m = 1, int d = 1)
    {
        Year = y; Month = m; Day = d;
        cout << "Constructor: ";
        ShowDate();
    }
    void ShowDate()
    {
        cout << Year << '.' << Month << '.' << Day << endl;
    }
    ~Date()
    {
        cout << "Destructor: ";
        ShowDate();
    }
};
Date d5(2008, 5, 5);
Date d6(2008, 6, 6);
static Date d7(2008, 7, 7);
static Date d8(2008, 8, 8);
void fun()
{
    cout << "进入fun()函数!\n";
    Date d9(2008, 9, 9);
    Date d10(2008, 10, 10);
    static Date d11(2008, 11, 11);
    static Date d12(2008, 12, 12);
    cout << "退出fun()函数!\n";
}
void function()
{
    cout << "进入function()函数!\n";
    Date d13(2008, 13, 13);
    Date d14(2008, 14, 14);
    static Date d15(2008, 15, 15);
    static Date d16(2008, 16, 16);
    cout << "退出function()函数!\n";
}
void main()
{
    cout << "进入main()函数!" << endl;
    Date d1(2008, 1, 1);
    Date d2(2008, 2, 2);
    static Date d3(2008, 3, 3);
    static Date d4(2008, 4, 4);
    fun();
    fun();
    function();
    function();
    cout << "退出main()函数!" << endl;
}

在这里插入图片描述

构造函数和析构函数的调用顺序与撤销顺序:
1、如果创建了全局对象,那么全局对象最先(进入main函数之前)调用构造函数,按全局对象的声明顺序依次调用构造函数,与全局对象的位置无关:可以在所有的函数之前,也可以在主函数后。
2、局部对象按创建的先后顺序依次调用构造函数。
3、在主函数外的函数中,如果创建了局部动态对象,函数结束,立刻撤销局部动态对象。如果创建了局部静态对象,函数结束不会立刻撤销。
4、主函数结束后,先撤销主函数中的动态对象。
5、最后撤销所有的静态对象(全局和局部),按静态对象创建顺序的相反顺序撤销(栈内存)。

参考
深蓝学院:C++基础与深度解析
C++程序设计教程(第3版) 王珊珊 臧洌 张志航 编著
C++ Primer Plus(第6版)中文版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重生之我是赏金猎人-SRC漏洞挖掘(五)-轻松GET某src soap注入

0x01 挖掘 在对某SRC测试时&#xff0c;本人根据其证书信息收集到了部分深度子域&#xff0c;并找到了其对应的业务IP段 写了个shell脚本ffuf批量fuzz某src c段资产目录 发现了xxSRC c段的一个提供了webservice的服务器 http://180.x.x.x/webservice/ 获取到接口 http://1…

全国计算机等级考试报名照片要求以及证件照制作教程

马上就全国计算机等级考试就要开始了&#xff0c;相信现在很多同学都在网上进行报名呢&#xff0c;报名的时候肯定需要用到个人证件照片&#xff0c;所以问题来了&#xff0c;我们怎么自己制作证件照片呢&#xff1f;计算机等级考试报名时对证件照都有哪些要求呢&#xff1f;该…

06 antdesign react Anchor 不同页面之间实现锚点

react Anchor 不同页面之间实现锚点一、定义二、使用步骤三、开发流程(一)、组件(二)、页面布局(三)、点击事件(四)、总结说明一、react单页面应用&#xff0c;当前页面的锚点二、react单页面应用&#xff0c;不同页面的锚点思路&#xff1a;锚点只能在当前页面使用&#xff0c…

central cache设计及实现

你好&#xff0c;我是安然无虞。 central cache 设计及实现 central cache 也是一个哈希桶结构, 而且它的哈希桶的映射关系跟 thread cache 是一样的, 不同的是 central cache 每个哈希桶位置上挂的是 SpanList 双向链表结构, 而且每个哈希桶下面的 span 中的大块内存被按映射…

大数据之数据中台

目录数据仓库传统数据仓库无法支撑互联网时代的商业智能数据埋点数据仓库 数据仓库是在企业管理和决策中面向主题的、集成的、与时间相关的、不可修改的数据集合。 在电商场景中&#xff0c;有一个数据库专门存放订单的数据&#xff0c;另外一个数据库存放会员相关的数据。构建…

订单服务:订单流程

订单流程 订单流程是指从订单产生到完成整个流转的过程&#xff0c;从而行程了一套标准流程规则。而不同的产品类型或业务类型在系统中的流程会千差万别&#xff0c;比如上面提到的线上实物订单和虚拟订单的流程&#xff0c;线上实物订单与 O2O 订单等&#xff0c;所以需要根据…

[Datawhale][CS224W]图机器学习(三)

目录一、简介与准备二、教程2.1 下载安装2.2 创建图2.2.1 常用图创建&#xff08;自定义图创建&#xff09;1.创建图对象2.添加图节点3.创建连接2.2.2 经典图结构1.全连接无向图2.全连接有向图3.环状图4.梯状图5.线性串珠图6.星状图7.轮辐图8.二项树2.2.3 栅格图1.二维矩形栅格…

如何修改 类名::静态变量?

好久没更新了&#xff0c;其中经历了备战省赛&#xff0c;重装电脑&#xff0c;换服务器&#xff0c;重新搭建博客等一系列事&#xff0c;受到许多技术大牛的指点&#xff0c;而且新人太厉害了&#xff0c;卷卷卷&#xff01; Geek Challenge 2021有一道BabyPOP&#xff0c;这…

vue写一个翻页的时间插件

读秒效果有一个从上向下的翻页效果 效果图 clock代码 <template><div class"dateClock"><div class"todayClass"><p class"datep">{{dateToday}}</p><span style"float:right;font-size:16px">…

基于 VPX 总线的工件台运动控制系统研究与开发-DSP+FPGA硬件架构(一)

作为光刻机核心单元之一&#xff0c;超精密工件台主要负责实现快速扫描、上下片、精密定位、调平调焦等功能。目前&#xff0c;较为成熟的方案大多采用 VME 并行总线架构来建立超精密工件台控制系统&#xff0c;由于随着系统性能要求的提升&#xff0c;VME 总线以及相应的处理器…

最大连续子列和

给定一个数组&#xff0c;求它的最大连续子列和。这个问题有四种解法。 1、暴力循环(O(n^3))分析这个问题&#xff0c;既然是子列&#xff0c;那么它最长为n&#xff0c;最短为1。要想求和我们一般需要知道这个子列的左端下标和右端下标&#xff0c;再求这个子列的和。最简单的…

深入浅出带你学习Nginx中间件常见漏洞

前言 上篇文章总结了APACHE中间件的常见漏洞&#xff0c;本文介绍一个同样很常用的中间件——nginx&#xff0c;本文会讲解关于nginx中间件的常见漏洞利用方式与危害&#xff0c;下面展开来给大家讲解。 Nginx是什么&#xff1f; 在讲漏洞之前我们需要先知道什么是nginx,简单…

《SQL基础》11. 索引

SQL - 索引索引概述结构B-TreeBTreeHash思考分类语法SQL性能分析SQL执行频率慢查询日志profile详情explain执行计划索引失效情况范围查询索引列运算字符串不加引号模糊查询or连接条件数据分布影响使用规则最左前缀法则SQL提示覆盖索引前缀索引设计原则索引 概述 索引&#xf…

linux安装minio,注册服务实现开机自启动

一、安装1.创建安装目录mkdir -p /usr/local/soft/minio2.下载文件cd /usr/local/soft/miniowget -q http://dl.minio.org.cn/server/minio/release/linux-amd64/minio3.新建数据存储目录mkdir -p /home/minio/data4.授予可执行权限chmod x minio5.设置账号密码export MINIO_AC…

yolov8代码梳理 训练自己的数据 最终版

1.总结一下 最开始为了检测不规则的麻包袋&#xff0c;所以采用了目标检测。yolov3&#xff0c;fasterrcnn&#xff0c;ssd。这种矩形框还是可以用。后面检测的物体变成了规则的纸箱&#xff0c;我们还用目标检测发现&#xff0c;没有旋转角度&#xff0c;因为箱子的摆放不是正…

深度学习算法面试常问问题(三)

pooling层是如何进行反向传播的&#xff1f; average pooling&#xff1a; 在前向传播中&#xff0c;就是把一个patch的值取平均传递给下一层的一个像素。因此&#xff0c;在反向传播中&#xff0c;就是把某个像素的值平均分成n份 分配给上一层。 max pooling&#xff1a; 在前…

一文教你如何编写高效的接口测试,别再浪费时间了

目录 前言 1、什么是接口测试 2、为什么要做接口测试 3、接口测试的范围 4、接口测试的重点 5、测试原则 总结 前言 在所有的开发测试中&#xff0c;接口测试是必不可少的一项。有效且覆盖完整的接口测试&#xff0c;不仅能保障新功能的开发质量&#xff0c;还能让开发在…

PMP项目管理未来的发展与趋势

什么是项目管理&#xff1f;关于项目管理的解释主要是基于国际项目管理三大体系不同的解释及本领域权威专家的解释。 项目管理就是以项目为对象的系统管理方法&#xff0c;通过一个临时性的、专门的柔性组织&#xff0c;对项目进行高效率的计划、组织、指导和控制&#xff0c;以…

深度学习术语解释:backbone、head、neck,etc

backbone&#xff1a;翻译为主干网络的意思&#xff0c;既然说是主干网络&#xff0c;就代表其是网络的一部分&#xff0c;那么是哪部分呢&#xff1f;这个主干网络大多时候指的是提取特征的网络&#xff0c;其作用就是提取图片中的信息&#xff0c;共后面的网络使用。这些网络…

深入浅出带你学习利用session.upload_progress进行文件包含

前言 该思路是很久之前在CTF比赛中学习到的&#xff0c;可以简单理解为利用session.upload_progress来进行文件竞争从而达到上传文件进行文件包含或者命令执行的目的&#xff0c;可能大部分人会不理解&#xff0c;我们下面我们展开来讲。 基础知识 session.upload_progress …