《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
拷贝 赋值 销毁 拷贝构造函数 如果一个构造函数第一个参数是自身的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个类型必须是引用:如果参数不是引用类型,那么调用不会成功 ...
随机推荐
- k8s之API Server认证
集群安全性 在生产环境中,必须保障集群用户的角色以及权限问题,不能给所有用户都赋予管理员权限. 1.集群的安全性必须考虑如下几个目标 (1)保证容器与其所在宿主机的隔离 (2)限制容器给基础设置或其他 ...
- postgresql-从表中随机获取一条记录
目录 postgresql如何从表中高效的随机获取一条记录 随机获取一条记录random() 改写1 改写2 改写3 对比 注意 结语 postgresql如何从表中高效的随机获取一条记录 selec ...
- 对于k8s微服务的性能测试监控平台搭建
之前有写过对于传统项目的性能测试监控,但是对于目前市场占比已经很低,大部分项目使用k8s,今天讲一下对于k8s如何去监控. 对于k8s的监控我们所有的操作都要在master下进行. 一.部署grafa ...
- Deep Learn I'm back.
Intorduction: 时隔好几个月,我准备重新进入Deep Learning 的领域.昨天和老师聊了很多,之前觉得我做的工作就是排列组合,在水论文,灌水.但老师却说:这也是为将来的研究打基础. ...
- Python基础语法6-冒泡排序
用for循环实现冒泡排序(升序): array = [3,2,1] for i in range(len(array) - 1, 0, -1): for j in range(0, i): if ...
- docker 镜像导入load、导出save以及重命名
docker 导入导出操作 save 保存(导出)镜像 # 把镜像打包成 .tar # -o 要保存路径.tar # > 要保存路径.tar # docker save 镜像id > /存 ...
- 绝对定位上下左右都为0 margin为auto为什么能居中
老规矩,先来一段废话,我大学刚入门的时候觉得CSS很简单,记一记就会了,不就是盒模型嘛,现在想来觉得自己那时候真的很自以为是哈哈.但是随着工作沉淀,我明白了任何技术都有着它的深度和广度,正是因为不少人 ...
- Promise.all()使用实例
一.什么是Promise.all()? 在说这个之前要先说清楚promise.promise就是一个对象,专门用来处理异步操作的. 而Promise.all方法用于将多个 Promise 实例,包装成 ...
- missing tables and indexes的处理办法
最近做了SAP系统的异构迁移,顺便把oracle DB也升级了,从10g升级到11g,但是升级后,在DB02或者是ora_space中的diagnostics->Missing Tables a ...
- CMU数据库(15-445)Lab1-BufferPoolManager
0. 关于环境搭建请看 https://www.cnblogs.com/JayL-zxl/p/14307260.html 1. Task1 LRU REPLACEMENT POLICY 0. 任务描述 ...