C++ Primer Plus: 第十章 对象和类
10.2 抽象和类
- 封装的类型:
- 将实现细节放在一起并将它们与抽象分开被称为封装。
- 将数据放在类的私有部分中,实现数据隐藏是一种封装。
- 将实现的细节隐藏在私有部分中。
- 将类函数定义和类声明放在不同的文件中。
- 类对象的默认访问控制是private(结构的默认访问类型是public)
- 其定义位于类声明中的函数都将自动成为内联函数。因此类声明常将短小的成员函数作为内联函数。
- 每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享一组类方法,即每种方法只有一个副本。
10.3 类的构造函数和析构函数
- 使用构造函数:
class Stock
{
char * pn;
int m;
}
Stock::Stock(const string & co, int num)
{
...
}
1. 显式地调用构造函数:Stock food = Stock("World Cabbage", 250);
2. 隐式地调用构造函数:Stock garment("Furry Mason", 50);
使用析构函数:
用构造函数创建对象后,程序负责跟踪对象,直到过期为止。对象过期时,程序将自动调用析构函数。对象赋值:
与给结构赋值一样,在默认情况下,给类对象赋值时,将把一个对象的成员复制给另一个。C++将源对象的每个数据成员的内容复制到目标对象中相应的数据成员中。
Stock Stock1 = Stock("World Cabbage", 250);
Stock1 = Stock("Nify", 10);
由于Stock1对象已经存在,因此这条语句不是对Stock1进行初始化,而是将新值赋给它。这是通过让构造程序创建一个新的,临时的对象。然后将其内容复制给Stock1来实现。随后程序调用析构函数,以删除该临时对象。
- const成员函数:
只要类方法不修改调用对象,就应该将其声明为const.
void show() const;
10.4 this指针
- 每个成员函数(包括析构函数和构造函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,可以使用表达式*this。
10.5 对象数组
- 可以用构造函数来初始化数组元素,在这种情况下,必须为每个元素调用构造函数:
Stock sotcks[4]={
Stock("A",1),
Stock("B",2),
Stock("C",3)
};
剩下一个默认初始化。
10.6 类作用域
类作用域意味着不能从外部直接访问类的成员,公有成员函数也是如此。也就是说,要调用公有成员函数,必须通过对象。
作用域为类的常量
class A
{
private:
const int N = 4;
double cost[N];
}
这种做法是错误的,因为声明类只是描述了对象的形式,并没有创建对象。因此,在创建对象前,将没有用于存储值的控件。
实现办法:
1. 在类中声明一个枚举。在类声明中声明的枚举的作用域为整个类,因此可以用枚举为整型常量提供作用域为整个类的符号名称。
class A
{
private:
enum{Month = 12};
double cost[Month];
}
用这种方式声明枚举并不会创建类数据成员。也就是说,所有对象中都不包含枚举。另外,Month只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器将用12来替换它。
- 使用static