7.1 定义抽象数据类型
类的基本思想是数据抽象和封装。数据抽象是依赖于接口和实现分离的编程技术。
类的用户是程序员,而非应用程序的最终使用者。
成员函数的声明必须在类的内部,它的定义既可以在类的内部也可以在类的外部。
定义在类内部的函数是隐式的inline函数。
成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。任何自定义名为this的参数或变量的行为都是非法的。this的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址。
this是隐式的并且不会出现在参数列表中,C++的做法是允许把const关键字放在成员函数的参数列表之后,此时紧跟在参数列表后面的const表示this是一个指向常量的指针。像这样使用const的成员函数被称作常量成员函数。
对于常量成员函数,this是指向常量的指针,所以常量成员函数不能改变调用它的对象的内容。
编译器分两步处理类:1.编译成员的声明 2.然后才轮到成员函数体(如果有的话)。 因此,成员函数体可以随意使用类中的其它成员而无须在意这些成员出现的次序。
构造函数中,类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数,它无须任何实参。
=default的含义:Sales_data() = default; 定义这个构造函数的目的仅仅是因为我们既需要其他形式的构造函数,也需要默认的构造函数。
构造函数初始值列表为新创建的对象的一个或几个数据成员赋初值。
7.2 访问控制与封装
在C++中,使用访问说明符(private,public)加强类的封装性。
class和struct唯一的一点区别是,两者的默认访问权限不太一样。类可以再它的第一个访问说明符之前定义成员,对这种成员的访问权限依赖于类定义的方式。如果使用struct关键字,则定义在第一个访问说明符之前的成员是public的;相反,若是class则是private的。
处于统一编程风格的考虑,若定义的类的所有成员为public时,使用struct;否则,使用class。
类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元(friend)。如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开始的函数声明语句即可。
友元声明只能出现在类定义的内部,但在类内出现的具体位置不限。友元不是类的成员也不受它所在区域访问控制级别的约束。
封装的两个重要优点:1.确保用户代码不会无意间破坏封装对象的状态。2.被封装的类的具体实现细节可以随时改变,而无须调整用户级别的代码。
友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,必须在友元声明之外再专门对函数进行一次声明。
7.3 类的其他特性
如:在public中定义 typedef std::string::size_type pos; 在private中就可以使用pos去定义别的变量。通过把pos定义成public成员可以隐藏private中实现的细节。用来定义类型的成员必须先定义后使用。
一个可变数据成员永远不会是const,即使它是const对象的成员。通过在变量的声明中加入mutable关键字可做到。
类的声明: class 类名; 这种声明有时被称作前向声明,在它声明之后定义之前是一个不完全类型。即我们知道它是一个类类型,但是不清楚它包含哪些成员。
必须完成类的定义,编译器才能知道存储该数据成员需要多少空间。因为只有当类全部完成后类才算被定义,所以一个类的成员类型不能是该类自己。然而,一旦一个类的名字出现后,它就被认为是声明过了(但仍未定义),因此类允许包含指向它自身类型的引用或指针。
类之间的友元关系:如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。
友元声明的作用是影响访问权限,它本身并非普通意义上的声明。
7.4 类的作用域
类的定义分两步处理:1.编译成员的声明 2.直到类全部可见后才编译函数体。
网友评论