10.3.1 声明和定义构造函数
构造函数原型:
// constructor prototype with some default arguments
Stock(const string &co, long n = 0, double pr = 0.0);
构造函数定义:
// constructor definition
Stock::Stock(const string & co, long n, double pr)
{
company = co;
if (n < 0)
{
std::cout << "Number of shares can't be negative; "
<< company << " shares set to 0.
";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}
10.3.2 使用构造函数
C++提供了两种构造函数来初始化对象的方式。第一种方式是显式地调用构造函数:
Stock food = Stock("World Cabbage", 250, 1.25);
另一种方式是隐式地调用构造函数:
Stock garment("Furry Mason", 50, 2.5);
这种格式更紧凑。
一般来说,使用对象来调用方法:
stock1.show(); // stock1 object invokes show() method
单无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不是通过对像来调用。
10.3.3 默认构造函数
Stock::Stock()
为类提供了构造函数后,程序员就必须为它提供默认构造函数。
如果提供了非默认构造函数,单没有提供默认构造函数,则下面的声明将出错:
Stock stock1; // not possible with curent constructor
定义默认构造函数的方式有两种。一种是给已有构造函数的所有参数提供默认值:
Stock(const string & co = "Error", int n = 0, double pr = 0.0);
另一种方法是通过函数重载来定义另一个构造函数——一个没有参数的构造函数:
Stock();
由于只能有一个默认构造函数,因此不要同时采用这两种方式。
使用上述任何一种方式(没有参数或所有参数都有默认值)创建了默认构造函数后,便可以声明对象变量,而不对它们进行初始化:
Stock first; // calls default constructor implicitly
Stock first = Stock(); // calls it explicitly
Stock *prelief = new Stock; // calls it implicitly
10.3.4 析构函数
用构造函数创建对象后,程序负责跟踪该对象,直到其过期为止。对象过期时,程序将自动调用析构函数。
析构函数完成清理工作,因此实际上很有用。凌辱,如果构造函数使用new来分配内存,则析构函数将使用delete来释放这些内存。
析构函数原型:
~Stock();
析构函数定义:
Stock::~Stock()
{
cout << "Bye, " << company << "!
";
}
什么时候应调用析构函数由便器已决定,通常不应在代码中显示地调用析构函数。
如果创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用。
如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时(该对象是在其中定义的)自动被调用。
如果对像是通过new来创建的,则它将驻留在栈内存或自由存储区中,当使用delete来释放内存时,其析构函数将自动被调用。
10.3.5 改进Stock类
……
10.3.6 构造函数和析构函数小结
……