前言


在C++中,我们使用类定义自己得数据类型/通过定义新的类型来反应待解决的题的各种概念,是我们更容易编写、调试和修改程序。

我们需要主要关注数据抽象的重要性。数据抽象能帮助我们将对象的具体实现与对象能执行的操作分离开来

类的基本思想是数据抽象和封装。

数据抽象是依赖接口实现分离的编程&&设计技术;封装实现了类的接口实现的分离。

笔记


因为老师最近讲的课其实在我看来跨度特别大,每个知识点都只是涉及,好像只挑重点讲,我看这章的时候还有很多不懂得地方需要去翻前面的(直接跳过了前面的章节,之后肯定是要看的),包括现在有的地方还不是很清楚,应该还是要多看、多查。

7.1定义抽象数据类型


$Note:$当我们设计类的接口的时候,应该考虑如何才能使得类易于使用;而当我们使用类时,不应当顾及类的实现机理

定义和声明成员函数的方式和普通函数差不多。成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部

$Note:$定义在类内部的函数隐式的$inline$函数(通常就是将它在每个调用点"内联地"展开)

#我们来思考个问题,当一个对象调用自己的成员函数时,如何保证成员函数中对数据成员的处理是针对自己的数据成员而不是其他对象的数据成员呢? $this$指针

成员函数通过$this$这个额外的隐式参数来访问调用它的那个对象。

$e.g.$ 我们调用$total.isbn()$时,编译器负责把$total$的地址传递给$isbn$的隐式形参$this$。当$isbn$使用$bookNo$时,它隐式地使用this指向的成员,就跟书写了$this->bookNo$一样

要想存放常量对象的地址,只能使用指向常量的指针。但是这里的$this$指针默认是一个指针常量,例如在$Sale$_$data$的成员函数中,$this$的类型是$Sales$_$data$  $*const$,所以我们需要将$this$声明承指向常量的指针(常量指针),而紧跟在参数列表后面的$const$就表示$this$是个指向常量的指针

std::string isbn() const { return bookNo }

关于指针常量和常量指针,可以看这里,这里需要去理解清楚

编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体。因此,成员函数体可以随意使用类中的其他成员而舞需在一这些成员出现的次序。

当我们在类的外部定义成员函数时,成员函数的定义必须和它的声明匹配。

每个类都分别定义了它的对象被初始化的方式,类通过一个/几个特殊的成员函数来控制其对象的初始化工程,这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员。

构造函数的名字和类名相同,没有返回类型。类可以包含多个构造函数,不同的构造函数之间必须在参数数量或参数类型上有所区别

如果我们的类没有显式地定义构造函数,那么编译器就会为我们隐式地定义一个默认构造函数,又被称为合成的默认构造函数:

  • 如果存在类的初始值,用它来初始成员
  • 否则,默认初始化该成员

默认构造函数无需任何实参。但是需要注意的是某些类不能依赖合成的默认构造函数。

这里给出几种构造函数:

Sale_data()  = default;
Sale_data(const std::string &s): bookNo(s) { }
Sale_data(const std::string &s, unsigned n, double p):
bookNo(s), units_sold(n), revenue(p*n) { }

当然我们也可以在类的外部定义构造函数

有个小细节是,不同于其他成员函数,构造函数不能被声明成$const$。

$this$是指向常量的指针,所以常量成员函数不能改变它调用的对象,而构造函数本身就是要构造对象,故不能是常量的

《C++ Primer》Chapter 7 [类]的更多相关文章

  1. C Primer Plus--C存储类、链接和内存管理之存储类(storage class)

    目录 存储类 作用域 链接 存储时期 自动变量 寄存器变量 具有代码块作用域的静态变量 具有外部链接的静态变量 extern关键字 具有内部链接的静态变量 多文件 存储类 C为变量提供了5种不同的存储 ...

  2. C++ Primer Chapter 1

    When I start reviewing, I thought Chapter is useless. Because the title is "Getting Start" ...

  3. C++ Primer 5 CH7 类

    7.1 定义抽象数据类型 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,定义可以在类的内部或外部.作为接口组成部分的非成员函数的声明和定义都在类的外部. 定义在类内部的函数是 ...

  4. C++ Primer 有感(类)

    1.在类内部,声明成员函数时必需 的,而定义成员函数则是可选的.在类内部定义的函数默认为inline. 2.const成员函数不能改变其所操作的对象的数据成员.const必须同时出现在声明和定义中,若 ...

  5. C++ Primer 笔记——嵌套类 局部类

    1.嵌套类是一个独立的类,与外层类基本没什么关系.特别的是,外层类的对象和嵌套类的对象是相互独立的.在嵌套类的对象中不包含任何外层类定义的成员,在外层类的对象中也不包含任何嵌套类定义的成员. 2.嵌套 ...

  6. C++ Primer 笔记——IO类

    1.C++语言并未定义任何输入输出语句,取而代之,包含了一个全面的标准库来提供IO机制. 由上图能够知道,I/O操作的基类是ios_base,各个类的用途例如以下: <iostream> ...

  7. 【c++ primer, 5e】类的其他特性(卒)

    1 - Class Members Revisited 2 - Functions That Return *this 3 - Class Types 4 - Friendship Revisited ...

  8. C++ primer chapter 12

    动态内存:之前的程序使用对象有着严格定义的生存期,会自动销毁.C++支持动态分配对象,动态分配对象的生存期和他们在哪里创建是无关的,只有当显式的被释放,这些对象才会销毁.标准库定义了智能指针对象可以自 ...

  9. C++ primer chapter 13

    拷贝 赋值 销毁 拷贝构造函数 如果一个构造函数第一个参数是自身的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个类型必须是引用:如果参数不是引用类型,那么调用不会成功 ...

随机推荐

  1. strings包

    http://docscn.studygolang.com/pkg/strings/ Golang官方对strings包的介绍,strings包都是关于字符串的操作 常用的函数: 判断s1中是否包含字 ...

  2. Spark学习进度10-DS&DF基础操作

    有类型操作 flatMap 通过 flatMap 可以将一条数据转为一个数组, 后再展开这个数组放入 Dataset val ds1=Seq("hello spark"," ...

  3. poj-DNA排序

    描述 现在有一些长度相等的DNA串(只由ACGT四个字母组成),请将它们按照逆序对的数量多少排序. 逆序对指的是字符串A中的两个字符A[i].A[j],具有i < j 且 A[i] > A ...

  4. APP测试之Monkey测试

    一.简介 1.什么是Monkey测试? Monkey testing,也有人叫做搞怪测试.就是用一些稀奇古怪的操作方式去测试被测试系统,以测试系统的稳定性.Monkeytest,一般指这样的测试活动, ...

  5. 安装python性能检测工具line_profiler

    line_profiler是一款监测python的CPU密集型性能问题的强大工具,可以对函数进行逐行分析,在linux上安装时一切正常,然而今天在win10 64位系统安装失败了 pip3 insta ...

  6. 利用容器逃逸实现远程登录k8s集群节点

    某天, 某鱼说要吃瞄, 于是...... 李国宝:边缘计算k8s集群SuperEdge初体验 ​ zhuanlan.zhihu.com 图标 照着上一篇文章来说,我这边边缘计算集群有一堆节点. 每个节 ...

  7. 翻译 - ASP.NET Core 基本知识 - Web 主机 (Web Host)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-5.0 ASP. ...

  8. day131:2RenMJ:2RenMJ游戏简介&部署MJ项目到本地

    目录 1.游戏简介 1.如何做出一款麻将游戏? 2.麻将运行界面 3.麻将项目所用技术快速概览 4.web开发 / 游戏开发 / APP开发 比较 5.firefly游戏框架介绍 2.部署麻将项目到本 ...

  9. 【Android初级】如何动态添加菜单项(附源码+避坑)

    我们平时在开发过程中,为了灵活多变,除了使用静态的菜单,还有动态添加菜单的需求.今天要分享的功能如下: 在界面的右上角有个更多选项,点开后,有两个子菜单:关于和退出 点击"关于", ...

  10. JMETER-正则表达式提取与查看变量是否提取正确

    一.应用场景说明: 在一个线程组中,B请求需要使用A请求返回的数据,也就是常说的关联,将上一个请求的响应结果作为下一个请求的参数,则需要对A请求的响应报文使用后置处理器,其中最方便最常用的就是正则表达 ...