前言


在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. 【函数分享】每日PHP函数分享(2021-1-9)

    implode() 将一个一维数组的值转化为字符串. string implode ( string $glue , array $pieces ) 参数描述 glue     默认为空的字符串. p ...

  2. 深入了解MySQL主从复制的原理

    欢迎微信关注「SH的全栈笔记」 0. 主从复制 首先主从复制是什么?简单来说是让一台MySQL服务器去复制另一台MySQL的数据,使两个服务器的数据保持一致. 这种方式与Redis的主从复制的思路没有 ...

  3. linux mysql source 导入大文件报错解决办法

    找到mysql的配置文件目录 my.cnf interactive_timeout = 120wait_timeout = 120max_allowed_packet = 500M 在导入过程中可能会 ...

  4. Redis 5 配置 Redis sentinel(哨兵模式)

    先了解一下哨兵都 做了什么工作:Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: * 监控(Monitoring): Sentin ...

  5. 关于spring-data与elasticsearch的使用,自定义repository

    之前没有使用过spring-data,关于spring-data有很多很棒的设计,例如仅仅只需要声明一个接口就行,你甚至都不需要去实现,spring-data有内置默认的实现类,基本就上完成绝大多数对 ...

  6. 实操|如何将 Containerd 用作 Kubernetes runtime

    日前专为开发者提供技术分享的又拍云 OpenTalk 公开课邀请了网易有道资深运维开发工程师张晋涛,直播分享<Containerd 上手实践 >,详细介绍 Containerd 的发展历程 ...

  7. web dynpro配置注意事项

    如果你想使用web dynpro 开发的应用,但是发现浏览器报错,那么你按照下面的步骤逐一进行检查吧.特别是返回的500错误,或者是你发现浏览器的地址栏中以http://<hostname> ...

  8. Java-web易混淆知识点整理

    Java-web易混淆知识点 post和get区别 post: 数据不会显示在地址栏 安全 大小无限制 可以提交二进制文件 get: 数据显示在地址栏 不安全 get方式提交有大小限制(约4kb) 相 ...

  9. ThreadLocal 原理分析

    用法 ThreadLocal<String> threadLocal = new ThreadLocal<>(); // 无初始值 ThreadLocal<String& ...

  10. day132:2RenMJ:MJ需求文档&MJ游戏流程&Egret白鹭引擎安装&TypeScript简要介绍

    目录 1.麻将产品需求文档 2.麻将游戏流程 3.Egret白鹭引擎 4.TypeScript简要了解 5.TypeScript快速入门 1.麻将产品需求文档 1.麻将术语 1.名词术语 牌⼦: 序数 ...