面向对象高级编程下

news2025/6/9 16:11:31

面向对象高级编程下

  • 面向对象高级编程下
    • 一. 转换函数
    • 二. 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.coloradmin.cn/o/1504338.html

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

相关文章

C语言——函数指针——函数指针变量详解

函数指针变量 函数指针变量的作用 函数指针变量是指向函数的指针,它可以用来存储函数的地址,并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面: 回调函数:函数指针变量可以作为参数传递给其他函数&…

CIA402协议笔记

文章目录 1、对象字典1.1 Mode of Operation( 606 0 h 6060_h 6060h​)1.2 Modes of opration display( 606 1 h ) 6061_h) 6061h​) 2、状态机2.1 控制字(ControlWord、6040h)2.2 状态字(StatusWord、6041h)2.3 shutd…

C语言书籍——A/陷阱之处

文章参考于文献:《C陷阱与缺陷》[美]Andrew Koening 🌈个人主页:慢了半拍 🔥 创作专栏:《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 🏆我的格言:一切只…

杨辉三角(C语言)

杨辉三角 一.什么是杨辉三角 一.什么是杨辉三角 每个数等于它上方两数之和。 每行数字左右对称,由1开始逐渐变大。 第n行的数字有n项。 前n行共[(1n)n]/2 个数。 … 当前行的数上一行的数上一行的前一列的数 void yanghuisanjian(int arr[][20], int n) {for (int i…

3.9Code

基于顺序存储结构的图书信息表的图书去重 #include<iostream> #include<stdlib.h> #include<string.h>typedef int status;#define OK 1using namespace std;typedef struct{char no[50];char name[50];float price; }Book;typedef struct{Book* elem;int …

Linux 学习(持续更新。。。)

wc命令 命令直接执行&#xff0c;输出包含四项&#xff0c;分别代表&#xff1a;行数、字数、字节数、文件。 例子:编译下列代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #inclu…

七、软考-系统架构设计师笔记-数据库设计基础知识

1、数据库基础概念 数据库基本概念 数据(Data)数据库(Database)数据库管理系统(DBMS)数据库系统(DBS) 1.数据(Data) 是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。 数据的种类&#xff1a; 文本、图形、图像、音频、视频等。 2.数据库(Database, DB) 数据库…

JavaScript代码混淆与防格式化功能详解

在前端开发中&#xff0c;为了增加代码的安全性&#xff0c;防止恶意分析和逆向工程&#xff0c;有时候会采用一些防格式化的技术。这些技术主要通过混淆和难以阅读的方式来防止代码的易读性&#xff0c;提高代码的复杂度&#xff0c;增加攻击者分析的难度。 1. 代码压缩与混淆…

docker 使用官方镜像搭建 PHP 环境

一、所需环境&#xff1a; 1、PHP&#xff1a;7.4.33-fpm 的版本 2、Nginx&#xff1a;1.25.1 的版本 3、MySQL&#xff1a; 5.7 的版本 4、Redis&#xff1a;7.0 的版本 1.1、拉取官方的镜像 docker pull php:7.4.33-fpm docker pull nginx:1.25.1 docker pull mysql:5.7 do…

Character类

Character类 功能&#xff1a;实现了对 基本型数据的类包装。 构造方法&#xff1a; (char c) 常用方法&#xff1a; • public static boolean (char ch)//ch是数字字符返回true。 • public static boolean (char ch)//ch是字母返回 true。 • public static char (char c…

商家转账到零钱申请失败怎么办

商家转账到零钱是什么&#xff1f; 商家转账到零钱是微信商户号里的一个功能&#xff0c;以前叫做企业付款到零钱。从 2022 年 5 月 18 日开始&#xff0c;原企业付款到零钱升级为商家转账到零钱&#xff0c;已开通商户的功能使用不受影响&#xff0c;新开通商户可前往产品中心…

简介:图灵机和图灵测试

一、图灵机&#xff08;Turing machine&#xff09; 图灵机&#xff08;Turing machine&#xff09;是由英国数学家Alan Turing于1936年提出的一种抽象计算模型&#xff0c;阿兰图灵在24岁时发表论文《On Computable Numbers, with an Application to the Entscheidungsproble…

指针总结及例题总结

1 定义 指针是用来存放地址的变量 不同类型的指针变量所占用的存储空间是相同的&#xff0c;sizeof(int)sizeof(char)sizeof(double)... *是解引用操作符&#xff0c;&是取地址操作符&#xff0c;两者有着抵消作用 int a20;int* p&a;*p*&a20; 2&#xff0c;…

windows更改账户名

win R输入netplwiz 点击用户名进去&#xff0c; 修改用户名之后重启即可。

echarts 模拟时间轴播放效果

使用echarts柱状图模拟时间轴播放控制。开始/暂停/快进/慢进/点选 代码可直接放echart官方示例执行 let start new Date(2024-01-01); let end new Date(2024-01-10); let diff end - start; let dotLen 200;let data [start, end]; option {color: [#3398DB],tooltip: …

【笔记】Android ServiceStateTracker 网络状态变化逻辑及SPN更新影响

业务简介 在网络状态变化的时候&#xff08;数据或WiFi&#xff09;&#xff0c;会更新SPN。 基于Android U的代码分析。 分类&#xff1a;SPN Data_Dic-的博客-CSDN博客 功能逻辑 状态说明 飞行模式下注册上WFC的话&#xff0c;注册状态MD上报 regState: NOT_REG_MT_NOT…

Igraph入门指南 4

二、图的创建 图分有向图和无向图&#xff0c;所以图的创建有各自的实现方式。 1、手工创建图&#xff1a; 1-1 通过文本创建&#xff1a;graph_from_literal 通过每项提供两个顶点名&#xff08;或ID号&#xff09;作为一条边的格式&#xff0c;手动创建图&#xff0c;顶点…

RocketMQ-存储与弹性伸缩

存储与弹性伸缩 一、介绍二、存储架构图1.CommitLog2.ConsumeQueue3.IndexFile 三、消息读写流程1.写入流程1.1 获取Topic元数据1.2 消息投递1.3 消息写入 2.读取流程2.1 获取Topic元数据2.2 消息拉取2.3 消息消费 四、消息持久化1.页缓存2.刷盘2.1 同步刷盘2.2 异步刷盘 五、集…

力扣199. 二叉树的右视图(DFS,BFS)

Problem: 199. 二叉树的右视图 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 无论是DFS还是BFS我们都要思考到达二叉树的每一层&#xff08;或者每一层中的每一个节点&#xff09;时&#xff0c;我们都该如何按题目要求做出对应得处理!!!在本体中我们主要是&#x…

为什么不用 index 做 key?

“在 Vue 中&#xff0c;我们在使用 v-for 渲染列表的时候&#xff0c;为什么要绑定一个 key&#xff1f;能不能用 index 做 key&#xff1f;” 在聊这个问题之前我们还得需要知道 Vue 是如何操作 DOM 结构的。 虚拟DOM 我们知道&#xff0c;Vue 不可以直接操作 DOM 结构&am…