《C++ Primer Plus》《10、对象和类》

文章目录

  • 前言:
  • 1 过程性编程和面向对象编程
  • 2 抽象和类
    • 2.1 类型是什么
    • 2.2 C++中的类
    • 2.3 实现类成员函数
    • 2.4 使用类
  • 3 类的构造函数和析构函数
    • 3.1 声明和定义构造函数
    • 3.2 使用构造函数
    • 3.3 默认构造函数
    • 3.4 析构函数
  • 4 this指针
  • 5 对象数组
  • 6 类的作用域
    • 6.1 作用域为类的常量
    • 6.2 作用域内枚举
  • 7 抽象数据类型
  • 8 总结
  • 9 参考

前言:

面向对象编程(OOP)这是一种特殊的,设计程序的概念性方法,下面是他的一些特性:

  • a.抽象
  • b.封装和数据隐藏
  • c.多态
  • d.继承
  • e.代码的可重用性

C++与C最大的区别就是提出了类,以上的特点都是通过类来展开的,这一章将重点介绍“类”这个重要概念。

1 过程性编程和面向对象编程

所谓过程性编程是从代码实现的角度,来进行编程,用多个函数来解决复杂的问题;而面向对象编程,首先从用户的角度来考虑对象,描述对象所需的数据,以及描述用户与数据交互的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后,创建出程序,这便是C++相对于C的进步。
这样说有点晦涩,举个例子,你是个仓库管理员,仓库里放满了车子,你想编个程序进行管理,用C如何实现,我会用main()函数调用一个函数来获取输入,调用另一个函数,对车子停车时长进行计算,用第三个函数来显示结果;这些只是对数据的处理,我们后续还要进行增删查改,以及对数据的存储,还要创建另外的数组。这种方法太过死板;如果C++出马,首先他会创建一个对象记录车的各个数据,还要考虑如何处理这些数据,这样后续进行增删查改也更加灵活方便。

2 抽象和类

实际要解决的问题千奇百怪,最好的解决方法是化繁为简,以不变应万变。简单和抽象是解决复杂性问题的主要方法,即将问题的本质抽象出来,根据问题的特征来解决问题。

2.1 类型是什么

类型,比如定义你的理想型,肤白貌美,有钱,这是特性的描述,有人喜欢说话声音轻柔的,善解人意的,这就是你理想型的行为特征,所以类不仅有数据成员,还有方法成员。

2.2 C++中的类

在C++中类不仅是一个概念,更是一种解决问题的工具,它将数据表示和操纵数据的方法组合成一个完整的包。书中用一个表示股票的类,类中有2个部分:
1)股票信息:公司名称,股票数量等;
2)操作信息:增持,抛售股票等;
总结一下,类声明提供了类的蓝图,方法定义了实现的细节。

  • a.访问控制
    在类的声明中有两个关键字,private与public,描述了对类成员的访问控制。使用类对象的程序只能访问public部分,但只能通过公有成员函数来访问对象的私有成员。
  • b.控制对成员的访问:
    一般来说方法,成员函数的权限是private, 组成类接口的成员函数放在公有部分,其他成员都可以调用公用的接口。C++出于数据隐藏的目的,其他类成员只能通过类接口来访问类成员,否则无法进行访问。

2.3 实现类成员函数

通常在一个头文件中对类进行声明,而其中类的接口的实现在另一个源文件中实现,书中的示例就是将类方法全部写在另一个源文件中。详见股票程序。
在这里插入图片描述

2.4 使用类

在头文件中定义了类,并在一个源文件中定义了类接口的实现方法,接着就是在主函数中对类进行调用了,书中usestock00.cpp对类进行了调用,验证了程序的正确性。

3 类的构造函数和析构函数

类被设计出来有一个初衷:隐藏数据!所以数据部分的访问状态是私有的,这样程序就不能直接访问数据成员。为此,C++专门提供了一类特殊的成员函数——类构造函数,专门用于构造新对象,将数值赋予给他们的成员。而析构函数与构造函数的功能相反,实在程序的生命周期结束的时候,将他们的成员置空删除。

3.1 声明和定义构造函数

构造函数的声明种有一些形参,这些形参表示的不是类成员,而是要赋予给类成员的数值,要注意区别参数名与类成员名,为了做区分,通常将类成员名加上m_的前缀。

3.2 使用构造函数

创建了类之后,需要用构造函数,对类对象赋予初始值,赋予初始值有两个方法,
方法一:显示地调用

Stock A = Stock(“A”,1,1.0);

方法二:隐式地调用

Stock B(“B”,2,2.0);

3.3 默认构造函数

所谓默认的构造函数,就是未提供显式初始值时,用来创建对象的构造函数。在程序中当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。如果提供了非默认的构造函数,直接声明类对象会出错。
例如:

Stock(const char* co,int n,double pr)
Stock stock1

此时,声明的stock1就会出错。
除了不写构造函数,有2种方法可以构造默认函数,以上述的Stock为例子。
方法一:给已有的构造函数的所有参数提供默认值

Stock(const string &co = “Error”,int n = 0,double pr = 0.0);

方法二:通过函数重载来定义一个构造函数

Stock::Stock(){
	company = “error”;
	shares = 0;	
	share_val = 0.0;
	total_val = 0.0;
}

3.4 析构函数

用构造函数创建对象后,程序负责跟踪对象,直到其过期为止。对象过期时,程序会自动调用一个特殊的成员函数,负责完成清理工作。析构函数与构造函数同名,但是函数之前加上了一个~以作区分。析构函数内不需要做任何事情,要是没有写析构函数,程序会提供一个默认的析构函数。

4 this指针

每个类成员都只涉及一个对象,当涉及两个对象时,就需要使用C++的this指针。这个概念类似于我之前学习python的self函数代指自身。
书中有一个示例:topval()方法用来比较两个股票的总价,比较方法的原型是:

const Stock & topval(const Stock & s) const;

将其中股价较高的那一支股票赋值给top,

top = stock1.topval(stock2);

这个函数隐式地访问stock1,显示地访问stock2,此时就会发现,你只能返回引用的s,以上智能返回stock2,而不能返回stock1,C++提供了解决这种问题的方法——this指针,this被作为隐藏参数传递给方法。
补充:每个成员函数(包括构造函数和析构函数)都有一个this指针,this指针指向调用对象,如果方法需要引用整个调用对象,则可以使用表达式*this。

5 对象数组

在实际应用中,用户通常要创建同一个类的多个对象,这些对象又都属于同一个类,这就类似于“数组“的概念。这个时候需要显示地调用构造函数,将对象的参数都输入进去。
举个例子:

const int len = 4;
Stock stocks[len]={
	Stock(“A”,1,1),
Stock(“B”,2,2),
Stock(“C”,3,3),
Stock(“D”,4,4),
};

6 类的作用域

在类中定义的名称的作用域为整个类,作用域为整个类的名称只是在该类中是已知的。所以在不同类中使用相同的类成员名不会引起冲突。

6.1 作用域为类的常量

在类中如果要声明一个常量,直接const int x = 10;这样是不行的,在声明类中只是描述了对象的形式,并没有创建对象,所以在创建对象之前没有用于存储数值的空间。有2种方法可以实现常量的声明
1)在类中声明一个枚举:

class Barkey{
private:
			enum{Months = 12};
			double const[Months];
			……}

2)用static定义常量:

class Barkey{
private:
			static const int Months = 12;
			double const[Months];
			……}

6.2 作用域内枚举

传统的枚举可能存在一些问题,例如enum A {S,M,X,XL} enum B{S,M,X,L},这两个枚举量就存在冲突。为了避免这种冲突,C++11提供了一种新枚举,其枚举量的作用域为类。

enum  class  A {S,M,X,XL}enum  class  B{S,M,X,L}

引用的时候就添加A::S,这样就能避免冲突。

7 抽象数据类型

书中举了一个卖股票的例子,这个stock类十分的具体,有股票的各种信息,也包含了对股票的各种操作。但是程序员也会用类表示抽象数据类型(Abstarct data type)。书中用类来对栈进行描述。见书中程序清单。

8 总结

首先,提供了类这个概念,私有数据成员存储信息,公有成员函数提供访问数据的唯一途径,类将数据和方法合成了一个单元,私有数据成员实现了数据隐藏。
另外介绍了两个十分重要的函数构造函数与析构函数,用来创建与销毁类,并介绍了默认的构造与析构函数。
希望成员对多个类进行应用,介绍了this的概念,用this指针设置成调用对象的地址,*this是该对象的别名。

9 参考

9.1 《C++ Primer Plus》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初始化vue3(构建、配置)

白弟的记性不好,正所谓好记性不如烂笔头,还是把一些知识写下来更好,这一篇文章主要讲的就是初始化vue3项目的一些常规的配置,自动化部署在另一篇文章,大家可以自行查阅。 一、项目初始化(用的vite2&#xf…

【竞技宝】DOTA2-梦幻联赛S22:AR命悬一线 XG确定晋级淘汰赛

北京时间2024年2月28日,DOTA2梦幻联赛S22的比赛在昨日进入小组赛第三个比赛日,本次梦幻联赛共有AR、XG、IG三支中国区的队伍参赛,那么经过三日激烈的比赛之后,目前三支队伍的积分情况以及晋级形势如何呢? XG XG是小组…

【vue+element ui】大屏自适应中el-select下拉内容在低分辨率下显示不全问题解决

目录 背景 现象 解决方案 背景 最近要把一个1920px*1080px的大屏改成自适应的;最低适配到1028px*720px; 现象 自适应适配改完之后 将电脑屏幕改成1028px*720px分辨率后,下拉显示正常 通过谷歌浏览器设置Toggle device toolbar为1028px*…

unity使用Registry类将指定内容写入注册表

遇到一个新需求,在exe执行初期把指定内容写入注册表,Playerprefs固然可以写入,但是小白不知道怎么利用Playerprefs写入DWORD类型的数据,因此使用了Registry类 一. 对注册表中键的访问 注册表中共可分为五类 一般在操作时&#…

如何在Linux系统Docker部署Wiki.js容器并结合内网穿透实现远程访问本地知识库

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上,我们都需要通过某种方式来有条理的组织相应的知识架构,那么一个好的知识整…

GEE必须会教程—栅格影像数据的处理

今天继续GEE的学习,我们依然看到影像数据的处理,今天将涉及到的函数命令时栅格掩膜、栅格裁剪、栅格的波段选择创建、栅格的波段添加、栅格重投影以及栅格的色彩转换。 A.栅格掩膜 掩膜的意思就是以其中一个为边界范围,将边界范围内覆盖的数…

3_相机模型

相机标定对于联系相机测量和真实三维世界测量也很重要。它的重要性在于场景不仅仅是三维的,也是物理单位度量的空间。因此,确定相机的自然单位(像素)与物理单位(如mm)的关系是三维场景重构的重要部分。相机标定的过程既给出相机的几何模型又给出透镜的畸…

typescript 的常用方式

文章目录 前言一、绑定props 默认值的方式:withDefaults1.vue2 的props设置默认值2.vue3 的props设置默认值(1) 不设置默认值的写法(2) 设置默认值的写法(分离模式)(3) 设置默认值的写法(组合模式) 二、定义一个二维数…

Java数据结构之ArrayList与顺序表

一.线性表 什么是线性表,字面意思,就是可以连成一条线的表,这里的线可以是物理上的一条线,也可以是逻辑上的一条线 物理上的一条线就是类似于数组,即它在内存上是有一块连续的空间,叫做顺序表&#xff0c…

python 中常用的热门库介绍

阅读本文之前请参阅-----如何系统的自学python Python 是一种非常流行的编程语言,它的一个主要优势是拥有一个庞大的生态系统,其中包括许多强大的库。这些库为各种任务提供了解决方案,从数据分析到机器学习,从网络爬虫到图像处理。…

面试数据库篇(mysql)- 02定位慢查询和分析

定位慢查询 聚合查询多表查询表数据量过大查询深度分页查询表象:页面加载过慢、接口压测响应时间过长(超过1s) 方案一:开源工具 调试工具:Arthas 运维工具:Prometheus 、Skywalking 方案二:MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数(long_query_tim…

openstack常用查看命令

1.查看所有虚拟机 nova list2.列举某个虚拟机的详细信息 nova show ID3.获取所有服务列表 nova service-list4.查看镜像列表 glance image-list5.查看虚拟机规格信息 nova flavor-list6.查看网络信息 neutron net-list7.查看虚拟机网卡信息 nova interface-list8.查看vnc…

TCP的三次握手和四次挥手 | 查看网络状态

三次握手和四次挥手是在计算机网络中用于建立和终止TCP连接的协议。这两个过程是TCP协议的重要组成部分,确保数据的可靠传输。 三次握手指的是在客户端和服务器之间建立连接时的步骤。具体流程如下: 客户端向服务器发送一个连接请求报文段(…

Promise 介绍与基本使用 - 学习笔记

Promise 介绍与基本使用 1、 Promise 是什么?2、创建 Promise 实例对象3、Promise 实例方法4、Promise 的基本工作流程5、实例方法6、静态方法7、async 和 await7.1、关键字7.2、实例7.3、区别7.4、为什么使用 async/await 比较好? 1、 Promise 是什么&a…

【EI会议征稿通知】2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024)

2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024) 2024 3rd International Conference on Biomedical and Intelligent Systems (IC-BIS 2024) 2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024) 将于2024年4月…

皇冠测评:网络电视盒子哪个品牌好?电视盒子排行榜

欢迎各位来到我们的测评频道,本期我们要分享的产品是电视盒子,因很多网友留言不知道网络电视盒子哪个品牌好,我们通过为期一个月的测评后整理了电视盒子排行榜,想买电视盒子的可以看看下面这五款产品,它们各方面表现非…

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…

如何使用Windows系统电脑无公网ip远程桌面Ubuntu系统

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

吴恩达机器学习全课程笔记第四篇

目录 前言 P61-P68 激活函数 Softmax算法 P69-P73 Adam算法 更多类型的层 模型评估 P74-P79 偏差和方差 建立表现基准 学习曲线 偏差和方差与神经网络 前言 这是吴恩达机器学习笔记的第四篇&#xff0c;第三篇笔记请见&#xff1a; 吴恩达机器学习全课程笔记第…

leetcode 重复的子字符串

前要推理 以abababab为例&#xff0c;这里最主要的就是根据相等前后缀进行推导 s [ 0123 ] 如 t【 0123 】 f 【01 23 】 后两个分别是前后缀&#xff0c;第一个是总的字符串&#xff0c;然后可以推导 //首先还是算出…
最新文章