C++ Primer学习之(12)——类

P545:

通过类能够将实现和接口分离,用接口指定类所支持的操作,而实现的细节只需类的实现者了解或关心。

类类型常被称为抽象数据类型


P546:

语言设计的主要目标变成提供这样一些特性:

允许程序定义自己的类型,它们用起来与内置类型一样容易和直观。

最简单地说,类就是定义了一个新的类型和一个新的作用域。(!!!)


P549:

数据抽象是一种依赖于接口和实现分离的编程技术。类设计者必须关心类是如何实现的,但使用该类的程序员不必了解这些细节,他们可以抽象地考虑该类型做什么,而不必具体地考虑该类型如何工作。

建议:具体类型和抽象类型

并非所有类型都必须是抽象地。标准库中的pair类就是一个使用的,设计良好的具体类而不是抽象类。pair类型只是将两个数据成员捆绑成单个对象。在这种情况下,隐藏数据成员没有必要也没有明显的好处。

注:没有必要一味地隐藏数据成员。


P550:

好的类设计者会定义直观和易用的类接口,而使用者只关心类中影响他们使用的部分实现。在良好设计的类中,只有类的设计者会关心实现。

关键概念:数据抽象和封装的好处

1. 避免内部出现无意的,可能破坏对象状态的用户级错误。

2. 随时间推移可以根据需求改变或bug报告来完美类实现,而无须改变用户级代码。


P552:

使用类型别名来简化类

除了定义数据和函数成员之外,类还可以定义自己的局部类型名字。

class Screen 
{
public:
// interface member functions
typedef std::string::size_type index;
private:
std::string contents;
index cursor;
};

没有心情读了,集中不了注意力。

本来预计两周读完的,可是貌似才读一半多点点,周末和下周继续吧。今天有点不舒服,头晕晕沉沉的,喝了咖啡还是很困,工位坐着也是各种难受,转移到W3CSchool去学点简单的前端开发。


周末也没有继续看书了,休息了两天,反省反省,继续,集中注意力。

P557:

类对象

定义对象时,将为其分配存储空间,但定义类型时不进行存储分配。


P568:

类成员定义中的名字查找

按以下方式确定在成员函数的函数体中用到的名字:

1. 首先检查成员函数局部作用域中的声明。

2. 如果在成员函数中找不到该名字的声明,则检查对所有类成员的声明

3. 如果在类中找不到该名字的声明,则检查在此成员函数定义之前的作用域中出现的声明。

尽管全局对象被屏蔽了,但通过用全局作用域确定操作符(::)来限定名字,仍然可以使用它。

注:全局作用域确定操作符,::,之前一直不太明白的操作符。


P571:

构造函数

构造函数的作用是保证每个对象的数据成员具有合适的初始值。

使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数函数体中对数据成员赋值

有些成员必须在构造函数初始化列表中进行初始化。没有构造函数的类类型的成员,const或引用类型的成员,都必须在构造函数初始化列表中进行初始化。

记住,可以初始化const对象或引用类型的对象,但不能对它们赋值。初始化const或引用类型数据成员的唯一机会是构造函数初始化列表中。

按照与成员声明一致的次序编写构造函数初始化列表是个好主意。此外,尽可能避免使用成员来初始化其他成员。

只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数。

注:读这一部分很多地方都感觉模模糊糊的不对劲,不像前面几章写得明白。


P588:

友元

友元机制允许一个类将对其非公有成员的访问授予指定的函数或类。友元的声明以关键字friend开始。只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以不受声明出现部分的访问控制影响。通常,将友元声明成租地放在类定义的开始或结尾是个好主意。

友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。


P590:

友元声明与作用域

必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必预先定义类和非成员函数来将它们设为友元。


P591:

static类成员

全局对象会破坏封装:对象需要支持特定类抽象地实现。如果对象是全局的,一般的用户代码就可以修改这个值。类可以定义类静态成员,而不是定义一个可普遍访问的全局对象。

非static数据成员存在于类类型的每个对象中。static数据成员独立于该类的任意对象而存在。

类也可以定义static成员函数。static成员函数没有this形参,可以直接访问所属类的static成员,但不能直接使用非static成员。

优点:

1. static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。

2. 可以实施封装。static成员可以是私有成员,而全局对象不可以。

3. static成员是与特定类关联的。

static成员遵循正常的公有/私有访问规则。

static成员是类的组成部分但不是任何对象的组成部分,因此,static成员函数没有this指针。

static数据成员必须在类定义体的外部定义。static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。

保证对象正好定义一次的最好方法,就是将static数据成员的定义放在包含类非内联成员函数定义的文件中。

// define and initialize static class member
double Account::interestRate = initRate();


P595:

const statci成员

const static数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义。


这一章读不顺的感觉,不像前面几章,总有一些新的收获和见解,不知道是翻译太渣还是什么原因,反正总是读着没感觉。


第12章 类(完)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值