构造函数:
概念:创建对象时用来初始化对象的函数。
特点:
使用构造函数:
- 构造函数的命名与类名相同
- 不能别直接调用,必须通过new运算符在创建对象时才会自动调用
- 程序声明对象时,将自动调用构造函数
两种方式:
注意:不能使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。即构造函数是用来构造对象的,而不是被对象来调用的。1)显式调用
如:Stock food = Stock("world Cabbage", 250, 1.25);
2)隐式调用
如:Stock garment("world Cabbage", 250, 1.25);相当于:Stock garment = Stock("world Cabbage", 250, 1.25);
3)与new运算符一起使用时
如:Stock *pstock = new Stock("world Cabbage", 250, 1.25);
默认构造函数:
定义:未提供显式初始值的构造函数。
特点:
定义默认构造函数方法:有两种
- 由C++自动提供。其作用是创建对象,但没初始化它。
- 当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。即程序员定义了构造函数后必须定义默认构造函数,否则会出错。这样做的目的是为了防止创建未初始化的对象。
1)给已有构造函数的所有参数提供默认值
如:Stock(const string & co = “Error" , int n = 0, double pr =0.0);
2)通过函数重载定义另一个构造函数
如:Stock();
PS:两种方法不能共存,通常使用第一个,因为第一种可以在对象构造之初其成员就有已知的初始值。
复制构造函数:
概念:由编译器调用,完成基于同一类的其他对象的创建及初始化。其唯一的形参必须是引用。
原型:String(const String &other);
调用复制构造函数的时机:
1)一个对象作为函数参数,以值传递的方式传入函数体内;
2)一个对象最为函数返回值,以值传递方式从函数返回;
3)一个对象对另一个对象进行初始化。
PS:若前两种情况不使用复制构造函数,对导致一个指针指向 已经被删除的内存空间。对于第三种情况,复制构造函数是由普通构造函数和赋值操作符共同实现的,这也是需要复制构造函数的原因。
PPS:当某对象是按值传递时(无论作为函数参数还是返回值),编译器都会先建立一个此对象的临时拷贝,而在建立该临时拷贝时就会调用类的拷贝构造函数。
默认复制构造函数:
如果在类中没有显式声明一个复制构造函数,编译器会自动生成一个来进行对象之间非static成员的位拷贝。
格式:
声明:
class name
{
public:
name();
name(name & copyname);
……
};
实现:
name::name(name & copyname)
{
……;
}