C++模板进阶+继承详解

news2024/9/27 12:11:54

耕耘和收获不是连贯的,中间还隔着很长一段时间,那就是坚持!


一:模板进阶

1.1:非类型模板参数

这里的N就跟define一样,属于非类型模板参数。

1.2:array

array是c++11提供的一个数组,如果使用c语言的数组

  • 越界读,不检查

  • 越界写,检查

对于array来说

  • 越界读,检查

  • 越界写,检查

1.3:模板特化

1.3.1:函数模板的特化

昨天我们的这个仿函数实现了less的思路,但是我们以前实现过日期类

如果这样的话,那我们就会把两个日期类的地址进行比较,显然结果会出错。

因此我们需要进行模板特化,特化即为特殊化。

函数模板特化的步骤:

  • 有一个基础的函数模板

  • 关键字template后面跟一对<>

  • 函数名后跟一对<>,且<>中指定需要特化的类型

  • 函数形参表:必须要和模板的基础参数类型完全相同。

对于日期类我们可以如下:

因为这样的形式和函数重载一样,函数名相同,形参的个数和顺序一样,只是类型不同。

因此可以直接给出函数,不用写关键字template<>。

1.3.2:类模板的特化

1.3.2.1:全特化

让wjw特化成参数为int和char类型的类模板。全特化就是将模板参数列表中所有的参数都确定化。

1.3.2.2:偏特化

1.3.2.2.1:部分参数特化

对于一个类模板

如果只对其中一部分参数进行特化,就叫偏特化的一种。比如这里特化T2为double类型。

可以看到,d1用了默认的基础模板,d2调用了特化的模板,因为编译器会自动选择更好的模板,如果d2选用基础模板,T2还需要推导类型,所以直接走特化模板。

但是,这只是第一种偏特化:对部分模板参数进行特化

1.3.2.2.2:对模板参数的类型限定

第二种偏特化是:对模板参数的类型进行限定。

这里注意博主弄混淆了一个点:在类模板的特化中,我们这里的偏特化的第二种,是说限制模板参数的类型,比如把T变成T*,把T变成T&,我一开始在想为什么不直接用全特化呢,全特化是指让模板参数变为你需要的一个具体的类型,比如把T变为int*,int等等,他是改变T为一个具体的类型,偏特化是指把T本身的类型改变。

二:继承

2.1:继承概念

是面向对象程序使代码可以复用的最重要的手段,允许程序员在保持原有类的基础上进行拓展,增加功能,这样产生新的类,叫做派生类(子类),以前我们接触的复用都是函数的复用,继承属于类设计层次的复用。

2.2:继承定义

在类和对象我们学习过,访问限定符有public,protected,private,同样继承方式也是这三种。

基类继承派生类的成员访问方式关系如图:

  • 不可见是指,派生类无法直接访问基类的private成员,但是可以通过调用继承过来且可以使用的基类的用于访问基类成员的函数来访问。

  • 在类和对象我们学习过,即使加上private访问限定符,类外不能访问,但是类中可以访问,而这里的继承的不可见是类外类中都不能直接访问。

  • 根据表格,如果不想在类外访问成员,但需要在派生类中访问到,就定义为protected,由此可见protected访问限定符是因为继承才出现的。

  • 如果使用关键字class,默认继承方式是private,使用struct是public,不过最好显式写出继承方式。

  • 总结可以发现,派生类中对基类成员的访问权限=min(基类中该成员访问权限,继承方式)

  • 提倡使用public继承,因为用protected继承也只能在派生类中使用,维护性不强。

2.3:基类和派生类对象赋值转换

  • 派生类对象可以赋值给基类对象/基类指针/基类引用形象的说法叫切片,切割。

  • 基类对象不能赋值给派生类

  • 实际上这里赋值的意思就是,把派生类中继承于基类的那一部分变量的赋值给基类。

2.3:继承中的作用域

  • 在继承体系中,派生类和基类都有独自的作用域

  • 派生类和基类有同名成员(变量/函数),子类将屏蔽父类对同名成员的访问,这种情况叫隐藏。

也叫重定义。

  • 成员函数只要名称相同就构成隐藏。

  • 最好不要在基类和派生类定义相同名的成员。

问B和A的fun构成什么关系?重载? 重写? 重定义/隐藏? 编译错误?

  • 首先第一点也是最重要的一点,类和对象中我们学习过,函数重载的前提是在同一个作用域中,而这里B和A是2个不同的类,fun当然不会构成重载。

  • 重写是在多态中提出,这里也不会是重写

  • 显然这里是隐藏。

但是如果代码稍微改动一下:

改动了第21行代码,这时候就会出现编译错误,因为你不传参的时候,就是想调用A类的fun函数,但是没有指定类域,所以出错,如果想正确使用,应当是b.A::fun();

2.4:6大成员函数的继承

2.5:继承实战

这里在子类中的构造函数,如果我们想要给继承过来的父类对象进行初始化,我们直接用初始化列表不调用父类的构造函数初始化是不行的,这里规定是死的。

子类如果想要完成父类成员的初始化,必须调用父类的构造函数,如果父类没有提供默认构造,就要显式调用构造函数。这里我们就是显式调用父类的构造函数。改变第二行代码得到以下:也印证了2.4中的第一点。

拷贝构造也是,需要调用父类的拷贝构造完成父类的拷贝初始化。这里的原理就是2.3的切片,相当于把s这个子类中继承父类的那些东西拷贝给父类。这里印证了2.4的第二点。

operator=也必须调用父类的operator=完成父类的赋值重载。印证了2.6的第三点。

可以看到调用成功,当我们越过第六行代码的断点时,

s1成功被s3赋值。

本篇文章到此结束!

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

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

相关文章

MongoDB常用操作

官网地址&#xff1a;https://www.mongodb.com/docs/manual/reference/method/Date/ 实例&#xff1a;系统上运行的进程及节点集&#xff0c;一个实例可以有多个库&#xff0c;默认端口 27017。如果要在一台机器上启动多个实例&#xff0c;需要设置不同端口和不同的dbpath。库&…

第四章web服务器之httpd

文章目录第四章 web服务器1.1 www简介1.1.1 网址及HTTP简介1.1.2 HTTP协议请求的工作流程1.2 www服务器的类型1.2.1 仅提供用户浏览的单向静态网页1.2.2 提供用户互动接口的动态网站1.3 www服务器的基本配置1.4 实验1.4.1 搭建静态网站——基于http协议的静态网站1.4.2 搭建静态…

Acwing---1211.蚂蚁感冒

蚂蚁感冒1.题目2.基本思想3.代码实现1.题目 长 100 厘米的细长直杆子上有 nnn 只蚂蚁。 它们的头有的朝左&#xff0c;有的朝右。 每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是 1 厘米/秒。 当两只蚂蚁碰面时&#xff0c;它们会同时掉头往相反的方向爬行。 这些蚂蚁中…

C语言基本数据类型(一)

文章目录 前言 一、int类型 二、八进制和十六进制 三、其他整数类型 四、char 类型 五、_Bool 类型 六、 可移植类型&#xff1a;stdint.h和unttypes.h 前言 C语言基本数据类型包括声明变量、如何表示字面值常量&#xff0c;以及经典的用法。 一、int类型 C语言中包括许…

【openGauss】在openEuler(ARM架构)上安装openGauss(一主一备)

一、系统版本介绍 当前案例中的openGauss安装&#xff0c;底层操作系统为openEuler-20.03-LTS版本&#xff0c;当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本&#xff0c;该实验使用的openEuler版本自带Python 3.7.4&#xff0c;不需要再自行安装 二…

零基础如何入门网络安全?2023年最新,建议收藏!

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

前端必会手写面试题合集

实现Event(event bus) event bus既是node中各个模块的基石&#xff0c;又是前端组件通信的依赖手段之一&#xff0c;同时涉及了订阅-发布设计模式&#xff0c;是非常重要的基础。 简单版&#xff1a; class EventEmeitter {constructor() {this._events this._events || ne…

电力系统IEEE33节点Simulink仿真研究(Matlab实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

arduino基本知识认识和学习资源

个人对ardunio的感觉 **像是一个模块化功能的单片机&#xff0c;编程时在单片机中就像python在计算机语言的感觉。**硬件方面的功能比较单一依赖于传感器和硬件电路&#xff1b;编程比较简单&#xff0c;所有执行的函数都已经被封装&#xff0c;所以想要成为第一个用这个库吃瓜…

【C语言刷题】猜名次、猜凶手、杨辉三角、杨氏矩阵、字符串左旋、判断是否为左旋子串

目录 一、猜名次 二、猜凶手 三、杨辉三角 解法一&#xff1a; 解法二 四、杨氏矩阵 解法一 解法二 五、字符串左旋 解法一 解法二 六、判断是否为字符串左旋字串 解法一 解法二 总结 一、猜名次 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果…

基于轻量级CNN开发构建学生课堂行为识别系统

其实早在之前&#xff0c;我的一些文章里面就有做过关于学生课堂行为检测识别的项目&#xff0c;感兴趣的话可以自行移步阅读&#xff1a;《yolov4-tiny目标检测模型实战——学生姿势行为检测》《基于yolov5轻量级的学生上课姿势检测识别分析系统》这些主要是偏目标检测类的项目…

Raft论文阅读

Raft 论文阅读 参考&#xff1a; Raft Paper 一文搞懂Raft算法 - xybaby Raft Demo Raft 实现汇总 Raft 为什么是更易理解的分布式一致性算法 空挡) Raft协议实现之etcd(一)&#xff1a;基本架构 Raft 协议 - buttercup 【raft】学习二&#xff1a;etcd/raft raft数据结构学…

第四十八讲:神州路由器IPv6静态路由配置

实验拓扑图如下所示 配置步骤&#xff1a; 步骤1&#xff1a;配置R1接口 R1_config#ipv6 unicast-routing //启用IPv6路由 R1_config#in g0/4 R1_config-_g0/4#ipv6 address 2001:10::1/64 //手工配置IPv6地址 R1_config-…

LInux背景【Linux】

一、技术推动社会发展的基本动力作为万物之长的人类&#xff0c;我们相较于其他的生物哪里是特殊的&#xff1f;举一个例子&#xff1a;老虎需要几千上万年进化来的爪子&#xff0c;人类可以在更短的时间内通过制造石矛石斧这类工具变可以模拟。通过这一个例子我们得出——人的…

python自学之《21天学通Python》(7)

第10章 Python进阶话题 10.1 函数与命名空间 Python中可以通过模块来管理复杂的程序&#xff0c;而将不同功能的函数分布在不同的模块中&#xff0c;那么函数及其全局命名空间决定了函数中引用全局变量的值。函数的全局命名空间始终是定义该函数的模块&#xff0c;而不是调用该…

java面试之Spring篇

一、Spring概述 1. Spring由哪些模块组成 spring core&#xff1a;提供了框架的基本组成部分&#xff0c;包括控制反转&#xff08;Inversion of Control&#xff0c;IOC&#xff09;和依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;功能。spring beans…

windows无线连接Linux服务器,实现终端操作与文件传输

0、建议安装完Ubuntu后按照百问网的设置安装必要的linux软件 执行&#xff1a; git clone https://e.coding.net/weidongshan/DevelopmentEnvConf.git cd DevelopmentEnvConf sudo ./Configuring_ubuntu.sh 等待安装完成&#xff0c;大约半个小时事件。 我搭建的环境 家…

git的使用

一、创建仓库 gitee官网创建好用户之后&#xff0c;我们点创建仓库。 选择好语言&#xff0c;开源许可证随便选一个即可&#xff0c;模板我们最好设置一个Readme文件&#xff0c;方便后面写明仓库的介绍。 分支模型我们新手选一个单分支模型就可以了。 因为仓库创建的时候只能…

Windows下Canal.admin-1.1.6安装部署

一、下载解压 1 下载 进入页面&#xff1a;Release v1.1.6 alibaba/canal GitHub 下载 canal.admin-1.1.6.tar.gz 2 解压 解压至目录&#xff1a;D:\Tools\canal.admin-1.1.6 二、创建数据库 canal_manager 1 创建时间数据库&#xff1a;canal_manager 2 初始化元数据…

并发编程学习案例-模拟抢红包

一、前言 再来系统动手学习一下Java并发编程。 知识点&#xff1a;CountDownLatch 的发令枪使用模式&#xff1b;红包均分&#xff0c;最后一个分不完的解决方法 抢红包的需求,每个红包均分&#xff0c;最后一个除外 1. 设置红包总额 2. 设置红包的个数 3. 模拟抢红包的人数 &a…