前言


在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. VRP OS Management

    From WizNote

  2. centos 安装 部署 gitlab github

    https://www.cnblogs.com/wenwei-blog/p/5861450.html 我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 ...

  3. maven仓库和镜像

    目录 简介 本地仓库 远程仓库 远程仓库的更新 远程仓库的认证 部署到远程仓库 快照版本 依赖解析 镜像 本文主要是针对<maven实战>书中关键知识点的学习记录,未免有纰漏或描述不到之处 ...

  4. 奇技淫巧,还是正统功夫? - Python推导式最全用法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  5. 设计一款兼容ST207和GD207的开发板

    在MCU的学习中,大部分人都是学习别人的开发板,例如正点原子.野火等,优点是有可靠的教程和代码,缺点是容易让人有种自己全部都学会的了错觉,听了课程编写了代码,运行正常. 这个时候,可以尝试自已做一块属 ...

  6. postgresql-12编译安装

    1 准备环境 修改yum源 mkdir -p /etc/yum.bak mv /etc/yum.repos.d/* /etc/yum.bak/ &&\ curl -o /etc/yum ...

  7. Python执行程序实可视化_heartrate

    最近发现了一个Python程序执行的简单实时可视化神器,名字叫 heartrate,安装完运行可以看到下面这样的炫酷过程. 虽然很炫酷,但有点看不懂. 来解释下,左边的动态数字代表每行被触发的次数.变 ...

  8. FLask的偏函数应用

    偏函数 实际上,偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值.而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数 ...

  9. 使用 .NETCore自带框架快速实现依赖注入

    Startup 在Startup的ConfigureServices()中配置DI的接口与其实现 public void ConfigureServices(IServiceCollection se ...

  10. 查看内核打印信息指令dmesg

    linux系统启动的时候打印的的信息非常重要,有时候需要看这些信息但是又不想重启,可以用dmesg这条指令.