类的基本思想:数据抽象和封装。
数据抽象是一种依赖于接口和实现分离的编程技术,类的接口包括类能执行的操作,类的实现则是包括类的数据成员,负责接口实现的函数体以及定义类所需的各种私有函数。
成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在外部,
成员函数描述的是类的行为,:构造函数、析构函数、拷贝初始化构造函数等是类的成员函数。
成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定(见条款38),就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。成员函数是指在类内部定义的函数,非成员函数是指在某个命名空间或者全局空间内的函数,友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。成员函数与非成员函数的最大区别是,成员函数可以是虚拟的。
成员函数通过this的额外的隐式参数来访问调用他的那个对象,this是一个常量指针。
C++允许把const关键字放在成员函数的参数列表之后,此时,紧跟在参数列表之后的const表示this是一个指向常量的指针,像这样使用const的成员函数被称作常量成员函数
string isbn() const {return this->bookNo;}
该类的函数,如果成员被声明成常量成员函数,那么它的定义也必须在参数列表后明确指明const属性,this就是指的那个对象(实例化的类)。
构造函数:每个类都分别定义了他的对象被初始化的方式,类通过一个或者几个特殊的成员函数来控制其对象的初始化过程,
构造函数的任务是初始化类对象的数据成员,
构造函数与类名相同,但是没有返回类型,类也有一个(可以为空的)参数列表和(可以为空的)函数体,类可以包含多个构造函数,不能被声明为const,
类通过一个特殊的构造函数来控制默认初始化过程,这个函数就叫做默认构造函数,如果没有显式的定义构造函数,则编译器为我们隐式的定义一个默认构造函数。
sales_data (const string &s,unsigned n,double o):bookNo(s),units_sole(n),revenue(p*n){ }
新标准中,如果我们需要默认行为,那么我们可以用=default来要求编译器生成构造函数,
public成员定义类的接口。
class和struct的唯一 区别是:使用struct则在第一个访问说明符之前的成员是public的
class则这些成员是private的
他们唯一的区别就是默认的访问权限
友员函数:类可以允许其他类或者函数访问他的非公有成员,方法是令其他类或者函数成为他的友员,以friend关键字开始的函数
最好在类的定义开始或者结束的位置集中声明友元。
友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。
如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明。
可变的数据成员:
我们希望修改类的某个数据成员:mutable。
一个const成员函数可以改变一个可变成员的值
每一个类定义了唯一的类型,即便他们的成员完全一样,这两个类也是两个不同的类型。
友元关系不存在传递性。每个类负责控制自己的友元类或者友元函数。
构造函数的初始值有时必不可少:
如果成员是const或者引用的话,必须将其初始化,我们初始化const或者引用类型的数据成员的唯一机会就是在构造函数中,
委托构造函数:
一个委托构造函数使用他所属类的其他构造函数执行他自己的初始化过程,或者说它把自己的一些职责委托给了其他的构造函数。
explicit:
只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,所以不能用explicit,只能在类内声明构造函数时,使用explicit关键字,在类外部定义时,不能重复。
类的静态成员函数:不能和任何对象绑定在一起,他们不包含this指针,静态成员函数不能声明成const,切不能再static函数体内使用this指针。在类的外部定义静态成员时,不能重复static关键字,该关键字只能出现在类的内部的声明语句中。