3.5.3 通过构造函数约束对象的创建
假设我们有一个Emp类,它有一个具有惟一性的用来表示雇员编号的数据成员:
而且,我们希望阻止这种情况的发生:创建一个Emp的对象但不对数据成员id进行初始化。简而言之,我们不愿接受如下形式的定义:
例3-24
本例在定义elvis时产生一个错误:创建对象elvis时,要求编译器在main函数中调用Emp的默认构造函数,而Emp的默认构造函数是私有的,不能在main函数中访问。Cher的创建是合法的,因为Emp的带参构造函数是公有的,可以在main函数中访问。
我们在private区声明Emp的默认构造函数是为了强调:创建Emp的对象时,必须指定雇员编号,即使改变Emp声明。
不过,即使在Emp的声明中删除Emp的默认构造函数,如下所示变量定义仍是错误的。因为Emp没有提供公有的默认构造函数。
多数情况下,编译器为类生成一个公有的默认构造函数,只有下面两种情况例外:
一个类显式地声明了任何构造函数,编译器不生成公有的默认构造函数。在这种情况下,如果程序需要一个默认构造函数,由类的设计者提供。
一个类声明了一个非公有的默认构造函数,编译器不生成公有的默认构造函数。
因此,对第一条Emp对象声明,编译器不生成公有的默认构造函数,因为类声明中包含了一个构造函数和一个非公有的默认构造函数;对第二条Emp对象声明,编译器也不生成公有的默认构造函数,因为类声明中已经包含了构造函数。
C++(www.cppentry.com)程序员常常会将部分构造函数设计为私有成员,将另一部分设计为公有成员,以确保在创建对象时进行正确的初始化。一个私有构造函数与普通的私有成员函数一样,拥有类范围属性(见3.1.4小节),因而不能在类之外进行调用。