面向对象高级编程下

面向对象高级编程下

  • 面向对象高级编程下
    • 一. 转换函数
    • 二. non-explict-one-argument ctor
    • 三. explicit-one-argument ctor
    • 四. pointer-like classes
      • 1. 智能指针
      • 2. 迭代器
    • 五. function-like classes
    • 六. namespace
    • 七. 模板
      • 1.类模板
      • 2.函数模板
      • 3.成员模板
    • 八.模板特化和偏特化
      • 1. 模板特化
      • 2.模板偏特化
    • 九.模板模板参数
    • 十.可变参数模板
    • 十一.auto
    • 十二.reference
    • 十三.虚指针和虚表
    • 十四.关于this和动态绑定
    • 十五.const
    • 十六.重载operator new 和 operator delete
      • placement new

面向对象高级编程下

一. 转换函数

设计一个类Fraction表示分数,包含分子和分母。我们希望它能自动转换为double类型,并参与运算。

image-20240305163733517

image-20240305163750319

当编译器执行到 double d = 4 + f;这一行的时候,发现Fraction类型和一个整型或浮点型相加,首先找有没有重载+运算符,发现没有。然后找4能不能转换为Fraction类型,不能。最后找到转换函数,f可以转换为double类型。

转换函数的定义如下:

image-20240305163835071

  • operator是关键字,double是函数名,表示将Fraction转换为double类型,因为此处指明了输出类型,所以函数无返回值。

特点:

  • 没有返回类型。
  • 通常加const,因为不改变对象的数据成员的内容。
  • 是将这种东西转换为别的东西。

考虑将Fraction转化为其它类型,如string。

image-20240305164458523

image-20240305164513938

二. non-explict-one-argument ctor

image-20240305165223088

当编译器执行到 Fraction d2=f+4这一行的时候,发现Fraction类里重载了+运算符,但是+右边应该是Fraction类型的对象。由于Fraction类的构造函数没有加explicit,因此编译器将4隐式转换为Fraction类型的对象(因为Fraction的构造函数第二个参数有默认值,因此4可以当成4,1),然后通过重载的+运算符计算新值,赋值给d2。

特点:

  • 将别的东西转换为这种东西。

转换函数不能和non-explict-one-argument ctor共存

会出现二义性的问题。

image-20240306092346377

三. explicit-one-argument ctor

image-20240306092617498

明确告诉编译器,拒绝自动隐式转换。

explicit关键字基本用在构造函数前面。

四. pointer-like classes

1. 智能指针

image-20240306093227500

image-20240306094655455

2. 迭代器

image-20240306095236310

image-20240306095250904

为什么operator->要这么写?如图右边区域所示,我们希望通过->去调用对象的某个函数,因为->返回的是指针,我们希望左值是一个指针,因此返回值是指针类型。

那么如何将指针传递出来呢?

我们可以调用operator*来先取得对象内容,然后加上取地址&,就可以获得指针了。

五. function-like classes

仿函数:重载了函数调用操作符

image-20240306102856153

六. namespace

冒号作用域

:: 运算符是一个作用域。如果::前面什么都没有加,代表是全局作用域。

image-20240306133416609

名字控制

namespace 本质是作用域,可以更好的控制标识符的作用域。

命名空间可以存放:变量、函数、类、结构体 …

命令空间的定义 必须定义在全局范围

image-20240306133750154

image-20240306133923553

命名空间可以嵌套命名空间

image-20240306134041403

image-20240306134052128

命名空间可以取别名, namespace newname = oldname;新名字与旧名字有同等效益

命名空间可以没有名字 ,没有名字相当于给命名空间 内的所有成员加上了static修饰相当于只能被当前文件调用,属于内部链接属性

七. 模板

1.类模板

设计类的时候,考虑哪些类型可以允许使用者自行指定,那么设计为类模板。

image-20240306134403012

2.函数模板

设计函数的时候,参数类型不影响函数的规则或实现,比如说比大小,那么设计为函数模板。

image-20240306134543578

3.成员模板

本身是模板里的一个成员,同时自身又是模板。一般出现在构造函数中。

image-20240306135004041

T1、T2是可以变化的,但是在T1、T2确定下来后,U1、U2又是可以变化的。

image-20240306140229455

image-20240306140241192

八.模板特化和偏特化

泛化也就是模板,特化就是指定模板中的具体类型。

1. 模板特化

image-20240306140846617

2.模板偏特化

image-20240306141047656

image-20240306141055716

九.模板模板参数

函数模板是不支持模板的模板参数的,所以这儿所指的模板的模板参数就是类模板的模板参数,即对一个类模板,它的模板参数本身也是一个模板,更确切地说是一个类模板。

image-20240306141602056

image-20240306141614058

十.可变参数模板

image-20240308084640652

image-20240308085232881

十一.auto

image-20240308085857984

十二.ranged-base for

image-20240308090147084

十二.reference

image-20240308091026534

image-20240308093653461

image-20240308094227816

image-20240308093659415

十三.虚指针和虚表

image-20240308113908214

image-20240308113921086

image-20240308114213384

  • 可以发现子类对象中有父类的成分。

    • 子类继承父类的数据和函数,函数继承的是调用权。
  • C++编译器看见函数调用有两种选择:静态绑定或者动态绑定。

    • 符合某些条件会做动态绑定
      • 1.必须通过指针来调用
      • 2.指针是向上转型。(new的是子类,声明的是父类)
      • 3.调用的是虚函数
    • 其他时候是静态绑定。

十四.关于this和动态绑定

image-20240308163903636

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

我们可以打印一下this指针的值,然后打印对象的地址。

image-20240308165634697

image-20240308165707828

结果是一样的。

十五.const

image-20240308170319230

对象有两种(const和非const),成员函数有两种(const和非const),四种情况中const对象不能调用非const成员函数(因为非const成员函数可能会修改class data,然而const对象又是不可以修改的)。

image-20240308170343501

这种const只能用于成员函数,意思是不会修改class data。

十六.重载operator new 和 operator delete

重载全局

image-20240309100655419

image-20240309102454120

image-20240309102508847

image-20240309103723713

重载成员

image-20240309100717422

image-20240309101006251

image-20240309104755262

image-20240309104809083

image-20240309105011979

当调用operator[]分配内存的时候,分配的内存大小加上4,这四个字节代表了分配的内存空间的大小。

image-20240309105624394

placement new

我们可以重载operator new,写出多个版本,但是第一参数必须是size_t。

我们也可以重载operator delete,写出多个版本,但是它们绝不会被delete调用,只有当new所调用的构造函数抛出异常,才会调用这些版本。

image-20240309110635193

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Edu18 -- Divide by Three --- 题解

目录 Divide by Three: 题目大意: ​编辑​编辑思路解析: 代码实现: Divide by Three: 题目大意: 思路解析: 一个数字是3的倍数,那么他的数位之和也是3的倍数,所以我…

0基础学习VR全景平台篇第143篇:限定访问功能

大家好,欢迎观看蛙色VR官方——后台使用系列课程!这期,我们将为大家介绍如何使用限定访问功能。 一.什么是限定访问功能? 限定访问,就是可以在编辑后台设置可以访问作品的用户的类型,还有可以访问作品的IP…

【每日刷题】栈与队列-LC394、LC347、LC215

题外话:感觉脑子没长到栈这块…最近刷栈的题都好难啊…哭哭…坚持坚持!多刷几遍就好了!! 1. LC394.字符串解码 题目链接 先说数据结构。 维护两个栈:一个栈存之前的字符串,另一个栈存之后的字符串的重复…

OpenAI GPT LLMs 高级提示词工程方法汇总

原文地址:An Introduction to Prompt Engineering for OpenAI GPT LLMs Github:Prompt-Engineering-Intro 2023 年 3 月 2 日 Naive 提示词:带有提示的情感分类器 prompt Decide whether a Tweets sentiment is positive, neutral, or …

基于ThinkPHP框架的校园一卡通系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 框架技术 3 1.1.1 Bootstrap 3 1.1.2 ThinkPHP框架 3 1.2 前端技术 4 1.2.1 JavaScript 4 1.2.2 ECharts 4 1.3 B/S架构 4 1.4 数据库技术 5 1.4.1 MySQL 5 1.5 本章小结 6 2 系统分析 7 2.1 功能需求分析 7 2.2 非功能需…

每日OJ题_路径dp①_力扣62. 不同路径

目录 力扣62. 不同路径 解析代码 力扣62. 不同路径 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标…

博士推荐 | 薄膜、涂层技术和液晶材料/器件领域的博士

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态,用科技解决职业领域问题,提升行业数字化服务水平,提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

SLAM|初识SLAM

在空间中,人可以通过固定不动的事物来作为参考系中的参照物。 而这些固定不动的东西可以称之为特征,空间可以理解成特征存在的空间。 而参照物的意义,可以变成是看到某某参照物,就按这个某某参照物进行位置移动。 比如说碰到这个…

基于Springboot的高校宣讲会管理系统。Javaee项目,springboot项目。

演示视频: 基于Springboot的高校宣讲会管理系统。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

【Python】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 Python 目录: (一)装饰器函数 (二)牛客网—软件开发-Python专项练习 (三)time模块

鸿蒙原生应用元服务开发-WebGL网页图形库开发概述

WebGL的全称为Web Graphic Library(网页图形库),主要用于交互式渲染2D图形和3D图形。目前HarmonyOS中使用的WebGL是基于OpenGL裁剪的OpenGL ES,可以在HTML5的canvas元素对象中使用,无需使用插件,支持跨平台。WebGL程序是由JavaScr…

图|dfs bfs|最小生成树|最短路|一篇搞定图的所有知识点

文章目录 图前言项目代码仓库图的基本概念图的表示方法邻接矩阵邻接表图的一些相关概念 图的遍历bfsdfs如果给的图不是连通图? 最小生成树Kruskal算法Prim算法 最短路径单源最短路径--Dijkstra算法单源最短路径--Bellman-Ford算法多源最短路径--Floyd-Warshall算法 …