C++ primer plus读书笔记——第10章 对象和类
第10章 对象和类
1. 基本类型完成了三项工作:
决定数据对象需要的内存数量;
决定如何解释内存中的位;
决定可使用数据对象执行的操作或方法。
2. 不必在类声明中使用关键字private,因为这是类对象的默认访问控制机制。
3. 其定义位于类声明中的函数都将自动成为内联函数。
4. 如果愿意,也可以在类声明之外定义成员函数,并使其称为内联函数。为此,只需要在类实现部分定义函数时使用inline限定符即可。
5. 内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用的、最简便的方法是:将内联定义放在定义类的头文件中。(内联函数应该放在头文件中)
6. 设置显示的小数位数和恢复:
std::streamsize prec = std::cout.precision(3);//显示3位小数
…
std::cout.precision(prec);
设置定点表示,避免使用科学计数法:
using std::ios_base;
ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
…
cout.setf(orig, ios_base::floatfield);
7. 构造函数没有返回值,但没有被声明为void类型。
构造函数参数名不能与类成员相同。
8. 隐式调用构造函数:
Stock food(“World Cabbage”, 250, 1.25);
显式调用构造函数:
Stock food = Stock(“World Cabbage”, 250, 1.25);
和new一起使用:
Stock *pstock = new Stock(“World Cabbage”, 250, 1.25);
9. 默认构造函数
当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须提供默认构造函数了。否则,下面的定义将出错:
Stock stock1;
定义默认构造函数的方式有两种。一种是给已有构造函数的所有参数提供默认值。另一种是通过函数重载来定义一个没有参数的构造函数。
10. 调用默认构造函数的方式:
Stock first;
Stock first = Stock();
Stock *pstock = new Stock;
然而,不要被非默认构造函数的隐式形式所误导:
Stock second();
second是一个返回Stock对象的函数。隐式地调用默认构造函数时,不要加圆括号。
11. 析构函数的名称很特殊:在类名前加上~。析构函数没有返回值和参数。
12. 由于自动变量被放在栈中,因此最后创建的对象最先被删除,最先创建的对象最后被删除。
13. 下面两条语句有根本性的差别。
Stock stock2 = Stock(“Boffo Object”, 2, 2.0);//初始化,可能会创建一个临时对象。
Stock stock1;
stock1 = Stock(“Boffo Object”, 2, 2.0);//赋值,一定会创建一个临时对象。
14. const Stock land = Stock(“Boffo Object”, 2, 2.0);
land.show();//这一行如果show()不是const成员函数,将出错。
由于该方法所使用的对象是隐式地提供的,没办法使用const引用或指向const的指针来解决问题。为了让函数保证不会修改调用对象,C++的解决方法是将const关键字放在函数的括号后面。也就是说,show()的声明应像这样:
void show() const;
同样,函数定义的开头应像这样:
void Stock::show() const{…};
15. 如果编译器支持C++11,则可使用列表初始化:
Bozo bozetta = {“Bozetta”, “Biggens”};
Bozo bozetta{“Bozetta”, “Biggens”};
Bozo *pc = new Bozo{“Bozetta”, “Biggens”};
16. 接受一个参数的构造函数允许使用赋值语法将对象初始化为一个值:
Classname object = value;
这种特性可能导致问题,正如第11章将介绍的,可关闭这项特性。
17. this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。在函数的括号后面使用const限定符将this限定为const,这样不能使用this来修改对象的值。
18. C++在创建对象前,并没有用于存储值的空间,因此如下定义是行不通的:
class Bakery
{
private:
const int Months = 12;
double costs[Months];
…
有两种方式可以实现这个目标。
第一种方式使用枚举:
class Bakery
{
private:
enum {Months = 12};
double costs[Months];
…
用这种方式声明枚举并不会创建类数据成员,所有对象中都不包含枚举。Months只是一个符号名称。
由于这里使用枚举只是为了创建符号常量,并不打算创建枚举类型的变量,因此不需要提供枚举名。这种方法很常用,诸如ios_base::fixed就是ios_base类中定义的典型的枚举量。
第二种方式是使用static关键字:
class Bakery
{
private:
static const int Months = 12;
double cost[Months];
…
该静态常量将和其它的静态变量存储在一起,而不是存储在对象中。因此,只有一个Months常量,被所有Bakery对象共享。
19. 作用域内枚举(C++11)
传统的枚举存在一些问题,其中之一就是两个枚举定义的枚举量可能发生冲突。为避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。
enum egg {Small, Medium, Large, Jumbo};
enum t_shirt {Small, Medium, Large, Xlarge};
这将无法通过编译,因为egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突。为了避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。如下:
enum class egg{ Small, Medium, Large, Jumbo };
enum class t_shirt{Small, Medium, Large, Xlarge};
也可以使用关键字struct代替class,但无论使用哪种方式,都需要使用枚举名来限制枚举量:
egg choice = egg::Large;
t_shirt Floyd = t_shirt::Large;
该注意的是,作用域内枚举不能隐式地转换为整形,在必要时,可以进行显式类型转换。普通枚举的底层整形类型表示取决于实现。对于作用域内枚举,C++11规定它的底层类型为int。还提供了一种语法,可用于做出不同的选择:
enum class : short pizza {Small, Medium, Large, XLarge};
在C++11中,也可以使用这种语法指定常规枚举的底层类型,但如果没有指定,编译器选择的底层类型随实现而异。
20. 类很适用于描述ADT。公有成员函数借口提供了ADT描述的服务,类的私有部分和类方法的代码提供了实现,这些实现对类的客户隐藏。
C++ primer plus读书笔记——第10章 对象和类的更多相关文章
- C++ Primer Plus读书笔记(十)对象和类
1.类 不废话,上定义 class ClassName { public: xxx; private: xxx; protected: xxx; } private部分数据只能通过public 提供的 ...
- 《C++ Primer 4th》读书笔记 第10章-关联容器
原创文章,转载请注明出处:http://www.cnblogs.com/DayByDay/p/3936464.html
- C primer plus 读书笔记第五章
本章的标题是运算符,表达式和语句.主要研究如何处理数据. 示例代码展示了一个使用简单的while循环的代码,难度不大. 下面简单介绍本章的基本概念. 1.基本运算符. 基本运算符有:赋值运算符(C语言 ...
- 《JavaScript Dom 编程艺术》读书笔记-第10章
用JS实现动画~内容包括: 1. 动画基础知识 2. 用动画丰富网页的浏览效果 动画就是让元素的位置随时间而不断变化. 位置: //CSSelement{ position:absolute; top ...
- $《第一行代码:Android》读书笔记——第10章 Android网络编程
(一)WebView的用法 1.WebView也是一个普通的控件. 2.常用用法: WebView webView = (WebView)findViewById(R.id.web_view); we ...
- C++ primer plus读书笔记——第17章 输入、输出和文件
第17章 输入.输出和文件 1. 对键盘进行输入缓冲可以让用户在将输入传输给程序之前返回并更正.C++程序通常在用户按下回车键时刷新输入缓冲区. 2. 一些I/O类 streambuf类为缓冲区提供了 ...
- C++ primer plus读书笔记——第16章 string类和标准模板库
第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...
- C++ primer plus读书笔记——第15章 友元、异常和其他
第15章 友元.异常和其他 1. 友元类的所有方法都可以访问原有类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数.成员函数.或类为友元是由类定义的, ...
- C++ primer plus读书笔记——第14章 C++中的代码重用
第14章 C++中的代码重用 1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口. ...
随机推荐
- The 2018 ACM-ICPC CCPC NING XIA G-Factories
题意:在一棵数的叶子上建k个工厂保证,求两两距离之和的最小值. 思路:如果一个一个叶子节点去考虑去与否太麻烦了,直接考虑该节点的子树上选取几个作为工厂,利用树形DP,dp[u][i]表示的是u节点为根 ...
- Object类中的常用方法
1.getClass方法 源码: 功能: 返回此Object的运行时类. 什么是运行时类? 如上图所示,类从被加载到虚拟机内存开始,到卸载出内存为止,他的生命周期一共包含7个阶段.其中加载阶段虚拟机需 ...
- visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优
文/朱季谦 最近在做了一些JVM监控与调优的事情,算是第一次实践,还比较陌生,故而先把这一次经验简单记下笔记,这样,对后面学习调优方面时,不至于又想不起来了.本文档主要总结在window本地环境远程对 ...
- day03---Vue(04)
一.组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界 ...
- GoldenEye靶机work_through暨CVE-2013-3630复现
前言 备考OSCP,所以接下来会做一系列的OSCP向靶机来练手 靶机描述 I recently got done creating an OSCP type vulnerable machine th ...
- PReact10.5.13源码理解
React源码看过几次,每次都没有坚持下来,索性学习一下PReact部分,网上讲解源码的不少,但是基本已经过时,所以自己来梳理下 render.js部分 import { EMPTY_OBJ, EMP ...
- APP或者前端通过识别用户代理详细信息和浏览器数据进行安全防御
使用用户代理解析API 识别 访问您网站的浏览器,机器人,操作系统和设备 上手免费 阅读文档 解码用户代理 识别检测浏览器,操作系统,平台,设备类型以及其他30多个字段 多种浏览器,机器人,手机,平板 ...
- 别人 echo 、你也 echo ,是问 echo 知多少?-- Shell十三问<第三问>
别人 echo .你也 echo ,是问 echo 知多少?-- Shell十三问<第三问> 承接上一章所介绍的 command line ,这里我们用 echo 这个命令加以进一步说明. ...
- [2020年10月28日普级组]1406.SMRTFUN
S M R T F U N SMRTFUN SMRTFUN 题目描述 "又肥又温顺,又大又笨,他们看起来那么傻,而且也不有趣--" 这些牛想要证明,他们是既有趣,又聪明的.为了这样 ...
- [图论]最短路径问题 :Floyed-Warshall
最短路径问题 目录 最短路径问题 Description Input Output Sample Input Sample Output 解析 了解Floyed算法 Floyed算法的核心思想: 代码 ...