使用构造函数
-
两种使用构造函数的初始化方式:
Stock food = Stock("World", 250, 1.25);
等价于:
Stock garment("Furry", 50, 2.5);
-
将构造函数与new一起使用:(new可以调用构造函数)
Stock *pstock = new Stock("Electroshock", 18, 19.0);
通过构造函数赋值
构造函数不仅仅可用于初始化新对象,还可以给已经存在的对象赋值:
stock1 = Stock("Nifty", 10, 50.0);
这是通过让构造函数创建一个新的、临时的对象,然后将其内容复制给stock1来实现的。随后程序调用析构函数,以删除该临时对象。
默认构造函数
默认构造函数没有参数,因此如果创建对象时没有进行显式初始化,则将调用默认构造函数。
如果程序中没有提供任何构造函数,则编译器会为程序定义一个默认构造函数;否则,必须自己提供默认构造函数。
带参数的构造函数也可以是默认构造函数,只要所有参数都有默认值,如:
Klunk(int n=0) { klunt_ct=n; }
但只能有一个默认构造函数,否则会造成二义性:
Klunk kar() { klunk_ct = 0; }
Klunk(int n = 0) { klunt_ct = n; }
在构造函数中使用new时应注意的事项
- 构造函数中使用了new,要在析构函数中使用delete。
- new要和delete匹配:new对应于delete,new[]对应于delete[]。
- 多个构造函数中,要么都不带中括号(new),要么都带中括号(new[])。
- 应定义一个复制构造函数1,通过深度复制将一个对象初始化为另一个对象。
- 应当定义一个赋值运算符,通过深度复制将一个对象复制给另一个对象。
构造函数调用顺序
- 如果存在基类,那么先调用基类构造函数;
- 如果存在包含关系2,那么在基类构造函数调用完成以后,再调用被包含的对象的构造函数;
- 调用派生类的构造函数。
详见 “复制构造函数和深度复制” ↩︎