1 类的定义和声明
1.1. 类的定义和声明
最简单地来说,类就是定义了一个新的类型和一个新的作用域。
类成员:可以是数据 、函数或者类型别名。
构造函数:Sales_item():units_sold(0),revenue(0.0){}
成员函数:在类内部,声明成员函数时必须的,而定义成员函数则是可选的。
double avg_price() const; const成员不能修改其所操作的对象的数据成员。const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。
1.2 数据的抽象和封装
类背后蕴含的思想是数据抽象和封装。数据抽象是一种依赖接口和实现分离的编程技术。封装是一项将低层次的元素组合起来形成新的高层次实体的技术。函数是一种封装形式。同样的类也是一个封装实体:它代表了若干成员的聚集,大多数类类型隐藏了实现该类型的成员。
访问下标实施抽象和封装
数据抽象和封装提供了两个重要的优点:
1.避免类内部出现无意的,可能破坏对象状态的用户级错误。
2.随着时间推移可以根据需求改变或缺陷报告来完善类的实现,而无须改变用户级代码。
1.3 类的声明和定义
在一个给定的源文件中,一个类只能被定义一次。如果在多个文件中定义一个类,那么每个文件中的定义必须是完全相同的。将类定义放在头文件中,可以保证在每个使用类的文件中以相同的方式定义类。在声明之后定义之前。类screen是一个不完全类型,即已知screen是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针和引用,或者用于声明使用该类型作为形参类型或返回类型的函数。在创建类的对象之前,必须完整地定义类,而不是声明类,这样,编译器就会给类的对象预定相应的存储空间。同样地,在使用引用或者指针访问类的成员之前,必须已经定义类。如果该类型是不完全类型,那么数据成员只能是指向该类类型的指针或引用。类的前向声明一般用来编写互相依赖的类。
2.隐藏的this指针
2.1 尽管在成员函数内部显式引用this通常是不必要的,但有一种情况下必须这样做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时,最常见的情况是在这样的函数中使用this,该函数返回对调用该函数的对象的引用。
2.2 从const成员函数返回*this
从普通的非const成员函数中,this的类型是一个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。即不能改变this所指向的对象,也不能改变this所保存的地址。不能从const成员函数返回指向类对象的普通引用。const成员函数只能返回*this作为一个const引用。
2.3基于const的重载
const对象只能使用const成员,非const对象可以使用任一个成员,但非const版本是一个更好的匹配。
3. 类作用域
友元
SalesItem.h文件中 直接定义类StudentInfo为友元类
class SalesItem {
public:
friend class StudentInfo;
private:
static int aCityNumber;
在StudentInfo.h文件中
#include "SalesItem.h" 需要包含SalesItem.h头文件
std::string GetSlasItem(SalesItem salesItem) { return salesItem.aSalesName; } 可以随意调用SalesItem里面的私有变量。
4.static 类成员
非static数据成员存在于类类型的每个对象中。不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联。static成员函数没有this形参,它可以直接访问类的static成员,但不能直接使用非static成员。当我们在类的外边定义static成员时,无须重复指定static保留字,该保留字只出现在类定义体内部的声明处。
static成员函数不能被声明为const,毕竟将成员函数声明为const就是承诺不会修改该函数所属的对象。
static数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。保证对象正好定义一次的最好办法,就是将static数据成员的定义放在包含类的非内联成员函数定义的文件中(比如studentinfo.cpp中)。有一个例外,主要初始化是一个常量表达式,整形const static数据成员就可以在类的定义体中进行初始化。
private: static const int aAreaNumber=10;