《C++ primer plus》精炼(OOP部分)——对象和类(3)

news2024/12/24 2:49:15

学习是人类的天性,持续学习是人类的本能。

文章目录

  • 抽象数据类型(ADT)
  • --------------------------第11章:使用类--------------------------
  • 运算符重载
    • 运算符重载限制

抽象数据类型(ADT)

类的思想很适合用来实现抽象数据类型,这进一步增进了代码重用的可能性。
例如,可以用类的思想实现栈。栈由一组相同类型的元素组成,操作包括初始化空栈,push元素,pop元素,查看栈是否为满,查看栈是否为空。
为了提高数据的安全性和代码重用,我们可以适当隐蔽掉一些信息。下面是Stack抽象数据类型的初步声明:

#ifndef STACK_H_
#define STACK_H_

typedef unsigned long Item;//使用Item作为实际存储类型的代称

class Stack
{
private:
	enum { MAX = 10 };//类作用域的常量,由所有对象共享
	Item items[MAX];//使用数组来作为栈的实际存储方式
	int top;
public:
	Stack();
	bool isempty()const;
	bool isfull()const;
	//push() returns false if stack already is full,true otherwise
	bool push(const Item& item);//add item to stack
	//pop() returns false if stack already is empty,true otherwise
	bool pop(Item& item);//pop top into item
};

#endif

声明中有两点需要特别注意:

  1. 使用了typedef语句将实际存储类型unsigned long包装成Item,提高了代码重用性,将来如果想要用double类型的栈,只需要改动typedef语句即可。
  2. 将Item数组设计为私有 这意味着客户看不到栈实际存储的方式,公共接口以数组的形式使用栈中的元素。这意味着我们可以使用其他具有数组性质的存储结构来代替数组,比如vector(可变数组)来扩展功能。

--------------------------第11章:使用类--------------------------

这一章中我们深入类的细节实现,阐释一些便于实现类功能的语法。

运算符重载

我们在基础数据类型的内部实现中已经定义了一些常见的运算符,比如对于两个int类型的数a,b,a+b代表调用+运算符,输出结果为a和b相加。那么,如果我们定义一个Student类,类中带有学生的名字和分数:

class Student{
	string name;
	int grade;
}

我们能不能为这个类定义一个+运算符呢?如果定义的话,这
个运算符的输出结果是简单的“Student+Student”吗?
这显然是不可能的,Student+Student没有任何意义,但如果将+运算符的输出结果定义为Student.grade+Student.grade,这样的运算就有意义了,要实现这样的操作,可以使用运算符重载。
重载,就是重新定义一个函数。我们可以在函数声明和定义中重新定义一个名为“+”的函数。语法如下:

operatorop(argument list](op代表运算符)

那么,我们可以为Student类重载+运算符:

class Student{
	string name;
	int grade;
	int operator+(Student s)//像普通函数一样编写运算符重载,有返回值,只是函数名需要进行指定,由于+运算符是二元运算符,因此需要再传入一个参数
	{
		return this->grade+s.grade;
	}
	int operator+(int a)//可以多次重载同一个运算符,要求传入参数不同,就像普通的重载机制一样
	{
		return this->grade+a;
	}
	int operator+(double b)
	{
		return this->grade-b;//当然也可以这样做,但是这种“以减为加”的行为会混淆运算符的意义,强烈不建议这么做
}

在进行运算符重载的声明和定义后,我们可以使用这个函数:

void test(Student a,Student b)
{
	a.operator+(b);//可以像普通函数那样使用运算符重载函数
	int c=a+b;//这是运算符重载函数的简化使用方式,也是我们一般使用的方式,正如我们所说,实际上a调用了Student类的以Studnet对象b为参数的+运算符重载函数,并把输出结果放入c中
	int d=a+c;//a调用以int类型c为参数的+运算符重载函数并把结果放入d
}

运算符重载限制

C++在语法层面对运算符重载做出了一些硬性规定:

  1. 重载后的运算符必须至少有一个操作数是用户定义的类型
  2. 重载不能违反运算符原来的句法规则。例如,不能把二元运算符(比如+)重载成只有一个操作数:
int operator+()//不会通过编译,因为只有调用这个函数的Student对象一个操作数
{
	return this->grade;
}

也不能修改运算符的优先级(一般也不会修改)

  1. 不能创建新运算符(毕竟是重载)

  2. 不能重载一些特定的运算符:
    在这里插入图片描述
    (一般情况下也不会有人想到重载这些运算符吧)

  3. 有几个运算符只能通过类成员函数进行重载:
    在这里插入图片描述
    (经验:尽量用成员函数重载运算符就好)
    请添加图片描述
    我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!如果觉得好的话,可以关注一下,我会在将来带来更多更全面的知识讲解!

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

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

相关文章

狼的传说小游戏

欢迎来到程序小院 狼的传说 玩法: 鼠标左键选择能防御、战斧、风暴3%、滚石10%、藤曼5%、冰柱5%、飞跃10%、三叶草20%、钢叉15%,消灭所有敌人,不同关卡不同敌人,快去闯关消灭敌人吧^^。开始游戏https://www.ormcc.com/play/gameS…

Redis 事务 - 监控测试

Redis 基本事务操作 Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行! Redis事务是一组Redis命令的有序集合,这些命令在事务中按照顺序执行&#xff0…

昆明草海隧道湿地公园,荻花盛开,又一个网红打卡地

昆明,这座美丽的城市,总是带给人们无尽的惊喜。其中,草海隧道湿地公园更是备受游客青睐。而如今,这里已经成为了一处网红打卡地,吸引了无数游客前来观赏。 一、网红打卡地,草海隧道湿地公园草海隧道湿地公园…

【IEEE会议征稿】第三届电子信息工程与计算机技术国际学术会议(EIECT 2023)

第三届电子信息工程与计算机技术国际学术会议(EIECT 2023) 2023 3rd International Conference on Electronic Information Engineering and Computer Technology 随着科学技术的高速发展,计算机技术革新日新月异,其智能化、网络…

三分钟教会你快速使用SpringBoot整合第三方登录

前言 在我们生活中无时无刻都在使用第三方登录,如QQ登录、微信登录等,今天教你如何快速使用springboot整合第三方登录,下面教程以Gitee为例 1. 我们借助JustAuth组件来完成第三方登录 Justauth官网:https://www.justauth.cn/ …

数据在内存中的存储——练习3

题目&#xff1a; 3.1 #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }3.2 #include <stdio.h> int main() {char a 128;printf("%u\n",a);return 0; }思路分析&#xff1a; 首先二者极其相似%u是无符号格式进行…

Callable 和 FutureTask 带返回值线程使用和源码分析

Callable 和 FutureTask 可以创建带返回值的线程&#xff0c;那它是怎么实现的呢&#xff1f;笔者下面分析&#xff0c;先看看它是怎么使用的 1、Callable FutureTask使用 新建 Name类&#xff0c;实现 Callable 接口&#xff0c;返回 String 类型值 package com.wsjzzcbq.ja…

骨传导耳机危害有哪些?值得入手吗?

事实上&#xff0c;只要是正常使用&#xff0c;骨传导耳机并不会对身体造成伤害&#xff0c;并且在众多耳机种类中&#xff0c;骨传导耳机可以说是相对健康的一种耳机&#xff0c;这种耳机最独特的地方便是声波不经过外耳道和鼓膜&#xff0c; 而是直接将人体骨骼结构作为传声介…

时间序列预测系列之循环神经网络

文章目录 1.前言2.RNN基础组件1.RNN2.LSTM3.GRU4.FC-LSTM5.ConvLSTM6.CNN-LSTM 1.前言 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;简称RNN&#xff09;是一类在处理序列数据和时间序列数据时非常有用的神经网络架构。RNN的主要特点是它们具有循环连接&…

QT网页 webengine / CEF

QT WebEngine 官方文档 WebEngine 架构&#xff1a; 能看到 WebEngine 有一个核心模块是基于 Chromium 构造的&#xff0c;通过使用 Chromium 的Blink渲染引擎和V8 JavaScript引擎来处理和渲染Web内容&#xff0c;并将这些底层技术封装为一系列高级的C类和接口&#xff0c;以…

JVM基础-Hotspot VM相关知识学习

这里写目录标题 jdkJVM虚拟机类类的生命周期类加载的时机类的双亲委派机制类的验证 java对象Mark WordKlass Pointer实例数据对齐数据 字符串常量池垃圾收集器1.Serial收集器&#xff08;串行收集器&#xff09;cms垃圾算法G1垃圾收集器与CMS收集器相比, G1收集器的优势:G1收集…

开利网络到访东家集团,沟通招商加盟数字化机制落地事项

近日&#xff0c;开利网络到访东家集团&#xff0c;就集团近日开展的奖金池激励制度的推进情况和市场反馈进行复盘与沟通。通过打破“层层中间商”&#xff0c;提供厂家直供价格的方式&#xff0c;东家集团推出了数字化激励机制&#xff0c;消费集团会员礼包即可在会员专区进行…

Layui快速入门之第五节 导航

目录 一&#xff1a;基本概念 导航依赖element模块 API 渲染 属性 事件 二&#xff1a;水平导航 常规用法&#xff1a; 三&#xff1a;垂直导航 四&#xff1a;侧边垂直导航 五&#xff1a;导航主题 六&#xff1a;加入徽章等元素 七&#xff1a;面包屑导航 ps&a…

大学经典题目:Java输出杨辉三角形

本节利用​ 过 Java 语 ​言中的流程控制语句&#xff0c;如条件语句、循环语句和跳转语句等知识输出一个指定行数的杨辉三角形。 杨辉三角形由数字进行排列&#xff0c;可以把它看作是一个数字表&#xff0c;其基本特性是两侧数值均为 1&#xff0c;其他位置的数值是其左上方数…

Kettle——大数据ETL工具

文章目录 ETL一、Kettle二、安装和运行Kettle三、Kettle使用四、Kettle核心概念可视化转换步骤跳 ETL ETL(Extract-Transform-Load&#xff0c;即数据抽取、转换、转载)&#xff0c;对于企业或行业应用来说&#xff0c;我们经常会遇到各种数据的处理&#xff0c;转换&#xff…

【操作系统】进程的概念、组成、特征

概念组成 程序&#xff1a;静态的放在磁盘&#xff08;外存&#xff09;里的可执行文件&#xff08;代码&#xff09; 作业&#xff1a;代码&#xff0b;数据&#xff0b;申请&#xff08;JCB&#xff09;&#xff08;外存&#xff09; 进程&#xff1a;程序的一次执行过程。 …

5. 自动求导

5.1 向量链式法则 ① 例子1是一个线性回归的例子&#xff0c;如下图所示。 5.2 自动求导 5.3 计算图 5.4 两种模型 ① b是之前计算的结果&#xff0c;是一个已知的值。 5.5 复杂度 5.6 自动求导 import torch x torch.arange(4.0) x 结果&#xff1a; ② 在外面计算y关于x的…

linux 用户、组操作

一、创建用户并设置密码 #创建用户 duoergun useradd duoergun #设置用户 duoergun 密码 passwd duoergun二、创建组 #创建组 qingdynasty groupadd qingdynasty三、用户添加到组&#xff0c;用户从组删除 #添加用户duoergun到组qingdynasty usermod -aG qingdynasty duoer…

【CSS】React项目如何在CSS样式文件中使用变量

需求 在修改样式时候&#xff0c;需要根据不同条件&#xff0c;使用不同的样式&#xff0c;使用动态类需要多重判断&#xff0c;是否考虑使用变量传入的方式呢 应该怎么做 tsx import ./App.css; import ./test.cssfunction App() {const styles {--var: white,};return (…

20230912java面经整理

1.gc算法有哪些 引用计数&#xff08;循环引用&#xff09;和可达性分析找到无用的对象 标记-清除&#xff1a;简单&#xff0c;内存碎片&#xff0c;大对象找不到空间 标记-复制&#xff1a;分成两半&#xff0c;清理一半&#xff0c;没有碎片&#xff0c;如果存活多效率低&a…