类跟结构不一样的地方还有一个就是类应该要提供构造函数和析构函数。构造函数专门用于构造新对象,将值赋给它们的数据成员。构造函数最主要的特点就是名称与类名一样,同时构造函数没有返回值而且不能声明类型。
比如前面说的Stock类,它的构造函数就是Stock(...),首先再说明一下,构造函数没有返回类型。
同时,构造函数的参数表示的不是类成员,而是赋给类成员的值,因此,参数名不能与类成员相同。
定义了构造函数,就可以在声明类时使用它来初始化类的对象,就像结构一样,加一个括号,大括号里面放类对象的数据成员的值。
Stock food = Stock("stock1", ...);
Stock food("stock1", ...);
Stock *pstock = new Stock("stock1", ...);
上面写法都是合法的。
那么可不可以写Stock food不赋值了,答案是depends:
编译器可以提供一个默认构造函数,当且仅当没有定义任何构造函数时,这个时候Stock food就是合法。默认构造函数实际上是一个空函数:
Stock::stock () { }
这个时候就需要调用stock的其他成员函数来为stock food对象的数据成员函数赋值。
如果定义了构造函数,则必须再定一个不接受任何参数的默认构造函数,才能只写Stock food。这时候实际上运用了函数重载。如果只有普通构造函数,直接写Stock food是非法的。
用构造函数创建对象后,程序负责跟踪该对象,直到其过期为止。对象过期时,程序将调用一个析构函数来完成清理工作。比如某个对象用new来分配内存,就得用析构函数来delete掉。
析构函数的名称也很特殊:在类名前加上~,同样没有返回值和声明类型。析构函数没有参数:
~Stock(){...}
通常不在代码中显示地调用析构函数,而是由编译器决定什么时候调用。
类通常都有多个对象,如果某个类成员函数涉及到两个对象(例如比较两个对象),就需要使用C++的this指针。this指针指向用来调用成员函数的对象。每个成员函数都有一个this指针,比如我们的Stock有个数据成员double value,我们要比较stock1 和stock 2 的value,用Stock的成员函数max
Stock Stock::max(Stock stock2)
{
if (stock2.value > value)
return stock 2;
else
retrun *this;
}
这样如果stock1比stock2大的话就会返回自身
类的数组和结构数组差不多,就不祥写了。
类的作用域,在类定义的名称如类数据成员名和类成员函数名的作用域都是整个类。
Stock这个类还是比较具体的。现实生活中的类都很抽象,本章最后举了两个栈的例子来讲两个比较抽象的类,具体看书上的例子吧,这里也不拷贝了。