类的构造函数为类对象提供一种初始化机制,构造函数与类同名,它不能指定返回类型,甚至void也不行。多数类提供个一种特殊的缺省构造函数,他不需要指定初始值。C++对于一个类可以申明多少个构造函数没有限制,只要参数列表不同即可。
构造函数在定义一个类对象或者通过new表达式分配一个类对象时都会调用。如果一个类声明了一个或者多个构造函数,类对象就保证能被定义为不调用任何构造函数的实例。在实践中,如果定义了其他构造函数,则有必要提供一个缺省构造函数。
另外,构造函数不能用voliatiel或const关键字声明。被应用到类对象上适当的构造函数与该对象是const、非const或volatile无关。只有当构造函数执行完毕、类对象已经被初始化的时候,该类对象的常量性才被建立起来。
explicit修饰符通知编译器不要提供隐式转换,并且该关键字只能用于构造函数上。
缺省构造函数
缺省构造函数是指用户不需要指定实参就能够被调用的构造函数,这并不意味着他不能接受实参,只意味着构造函数的每个参数都有一个缺省值与之关联。如果类吧他的所有成员都声明为公有的,但没有构造函数例如
那么类对象的定义不会导致“类的特有初始化”发生。对于类A,我们可以看到,如果没有缺省构造函数,编译器也没有为他生成一个缺省构造函数:系统既没有生成缺省构造函数也米有调用它。也就是说,编译器并非为每个类都自动生成缺省构造函数。
非公有构造函数
我们可以将某些构造函数放到非公有访问区,从而限制或显示禁止某些形式的对象创建动作。这样做的主要用处:
1、防止用一个类对象向该类的另一个对象作拷贝
2、指出只有当一个类在继承层次中被作用基类,而不能直接被应用程序操纵时,构造函数才能被调用。
拷贝构造函数
在用一个类对象初始化该类的另一个对象被称为”缺省按成员初始化“,例如Account newAcc(oldAcc)。类的设计者可以通过提供特殊的”拷贝构造函数“来改变缺省的行为。
大多数实际的类定义,由于考虑到类的安全性以及用法的正确性,所以缺省按成员初始化是不够的。最经常出现的情况是,一个类的数据成员是一个指向堆内存的指针,并且该块内存由该类的析构函数释放。在缺省按成员初始化之后,两个类会指向同一块内存,当一个类对象被释放之后,另外一个对象指向的堆内存是要被释放的内存;而且当一个对象改变内存值时,另一个类对象也受到影响。
我们可以通过提供一个显示的拷贝构造函数来解决,也可以将拷贝构造函数声明为private的,防止按成员初始化发生。
拷贝构造函数有一个指向类对象的引用作为形参,一般会被声明为const。当我们写A a2(a1)时,编译器首先判断是否为类A声明了拷贝构造函数。如果声明了并且可以访问,则调用它。如果声明了但是无法访问,那么会发生一个编译时刻的错误。如果没有声明拷贝构造函数的话,则执行缺省的按成员初始化。