《C++ Primer》Chapter 7 [类]
前言
在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 [类]的更多相关文章
- C Primer Plus--C存储类、链接和内存管理之存储类(storage class)
目录 存储类 作用域 链接 存储时期 自动变量 寄存器变量 具有代码块作用域的静态变量 具有外部链接的静态变量 extern关键字 具有内部链接的静态变量 多文件 存储类 C为变量提供了5种不同的存储 ...
- C++ Primer Chapter 1
When I start reviewing, I thought Chapter is useless. Because the title is "Getting Start" ...
- C++ Primer 5 CH7 类
7.1 定义抽象数据类型 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,定义可以在类的内部或外部.作为接口组成部分的非成员函数的声明和定义都在类的外部. 定义在类内部的函数是 ...
- C++ Primer 有感(类)
1.在类内部,声明成员函数时必需 的,而定义成员函数则是可选的.在类内部定义的函数默认为inline. 2.const成员函数不能改变其所操作的对象的数据成员.const必须同时出现在声明和定义中,若 ...
- C++ Primer 笔记——嵌套类 局部类
1.嵌套类是一个独立的类,与外层类基本没什么关系.特别的是,外层类的对象和嵌套类的对象是相互独立的.在嵌套类的对象中不包含任何外层类定义的成员,在外层类的对象中也不包含任何嵌套类定义的成员. 2.嵌套 ...
- C++ Primer 笔记——IO类
1.C++语言并未定义任何输入输出语句,取而代之,包含了一个全面的标准库来提供IO机制. 由上图能够知道,I/O操作的基类是ios_base,各个类的用途例如以下: <iostream> ...
- 【c++ primer, 5e】类的其他特性(卒)
1 - Class Members Revisited 2 - Functions That Return *this 3 - Class Types 4 - Friendship Revisited ...
- C++ primer chapter 12
动态内存:之前的程序使用对象有着严格定义的生存期,会自动销毁.C++支持动态分配对象,动态分配对象的生存期和他们在哪里创建是无关的,只有当显式的被释放,这些对象才会销毁.标准库定义了智能指针对象可以自 ...
- C++ primer chapter 13
拷贝 赋值 销毁 拷贝构造函数 如果一个构造函数第一个参数是自身的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个类型必须是引用:如果参数不是引用类型,那么调用不会成功 ...
随机推荐
- 从 Java 代码到 CPU 指令
从 Java 代码到 CPU 指令 我们都知道,编写的 Java 代码,最终还是要转化为 CPU 指令才能执行的.为了理解 Java 内存模型的作用,我们首先就来回顾一下从 Java 代码到最终执行的 ...
- LeetCode解题Golang(1-10)
前言 LeetCode题目个人答案(Golang版) 本篇预期记录 1-10 题, 持续更新 正文 1.两数之和(简单) https://leetcode-cn.com/problems/two-su ...
- AvaloniaUI体验
公司的原有的PC端WPF产品有跨平台需求,无奈微软自己的xamarin对wpf的支持当前尚未达到能支撑产品的成熟度,于是经过搜索,发现了一个号称用WPF实现跨平台的第三方图形库AvaloniaUI. ...
- ./utils/build.sh: line 131: patch: command not found
安装 percona-xtrabackup-2.1.5过程中遇到如下问题: [root@test percona-xtrabackup-2.1.5]# ./utils/build.sh innodb5 ...
- 你不知道的Linux目录
Linux二级目录及其对应的作用 主要文件
- 在Jetbrain IDE中自定义TODO功能
好的IDE能为开发以及学习源码带来效率的提升,今天要介绍的就是Jetbrain家族中IDE自带的TODO功能,我认为利用好它,能够大大的提升阅读源码的效率. 假设我现在需要去阅读源代码,看了半天我终于 ...
- cobalt strike出现连接超时情况解决办法
服务器安装好teamserver服务后,进行连接,此时出现了连接超时的情况 检查方法: 一.检查端口是否正常开启 netstat -an | grep <设置的端口号>centos7可以用 ...
- MySQL全面瓦解19:游标相关
定义 我们经常会遇到这样的一种情况,需要对我们查询的结果进行遍历操作,并对遍历到的每一条数据进行处理,这时候就会使用到游标. 所以:游标(Cursor)是处理数据的一种存储在MySQL服务器上的数据库 ...
- 生僻标签 fieldset 与 legend 的妙用
谈到 <fieldset> 与 <legend>,大部分人肯定会比较陌生,在 HTML 标签中,属于比较少用的那一批. 我最早知道这两个标签,是在早年学习 reset.css ...
- 简单的DbContext工厂类(EFCore)
前言 根据appsettings.json的中配置的数据库类型,使用工厂模式创建DbContext 代码实现 appsettings.json中的配置项 //使用的数据库类型 "Server ...