1.构造函数的概念
类的一种成员函数,用来初始化类对象的数据成员
2.构造函数的特性
(1)函数名与类名相同,无返回类型。
(2)一个类可以含有多个构造函数,但是不同构造函数之间必须在参数数量或类型上有所不同。
(3)不能被声明成const
的。
注:在类中创建一个const
对象(此时所创建对象并没有常量属性),经过构造函数初始化后,const
对象拥有常量属性。
3.合成的默认构造函数
编译器隐式自动创建的构造函数,无须任何实参,不过只适用于非常简单的类。
合成的默认构造函数初始化规则:(1)数据成员存在类内初始值,则用类内初始值来初始化数据成员
(2)若数据成员不存在类内初始值,则使用合成的默认构造函数初始化函数成员
对于普通的类(不是非常简单的类),需要自己定义类的默认构造函数,不使用合成的默认构造函数。原因如下:
(1)当类中未声明任何构造函数时,编译器才自动创建默认构造函数,即合成的默认构造函数。若我们定义了其他的构造函数,则编译器就不会自动创建默认构造函数,但是类中的某些数据成员仍需默认初始化,此时,我们便需要自行定义一个默认构造函数。
(2)对于某些类,合成的默认构造函数可能执行错误操作。类中的内置类型于复合类型的成员需全部被赋予类内的初始值,类才适用于使用合成的默认构造函数。
(3)有时候编译器不能为某些类合成默认的构造函数。
4.定义构造函数(以Sales_data
类为例)
struct Sales_data{
string isbn() const { return bookNo; }
Sales_data& combine(const Sales_data&)
double avg_price() const;
string bookNo;
unsigned units_sold = 0;
double revenue 0.0;
}
(1)定义默认构造函数
Sales_data () = default ; // ①
构造函数①不接受任意参数,其为默认构造参数。
通过在参数列表后加 = default
要求编译器生成构造参数。
若Sales_data
类不支持类内初始值,即不存在
unsigned units_sold = 0;
double revenue = 0.0;
则默认构造参数①对类Sales_data
并不有效,这时应该利用构造函数初始化列表为类中每个内置类型成员进行初始化赋值。
(2)定义其他构造函数
Sales_data (const string &s): bookNo(s){ } // ②
Sales_data (const string &s,unsigned n,double p) // ③
:bookNo(s),units_sold(n),revenue(p*n) { }
上述部分为构造函数初始化列表,负责为新创建的对象中的一个或者多个数据成员赋予初值。以 bookNo(s)
为例,bookNo
为数据成员名,s
为该数据成员的初始值。
当类中的某些数据成员被构造函数初始列表忽略时,则被默认构造函数初始化,初始化规则同合成的默认构造函数相同。例如构造函数②初始列表忽略了数据成员units_sold、revenue
,则依据默认构造函数初始化规则对两个成员进行初始化,因为两个数据成员存在类内初始值,则使用类内初始值初始化成员函数。
若编译器不支持使用类内初始值,则所有构造函数都应该显示地初始化每个内置类型的数据成员。例如类Sales_data
不支持使用类内初始值,即不存在
unsigned units_sold = 0;
double revenue = 0.0;
则构造函数②错误,应该选用构造函数③。
(3)在类的外部定义构造函数
Sales_data :: Sales_data(istream &is) // ④
{
read(is, *this); //read函数的作用是读取一条交易信息,然后存入到this对象中
}
构造函数④,是由于该构造函数定义于类的外部,必须指明其属于哪个类的成员。 Sales_data :: Sales_data
,后者为构造函数Sales_data
,前者为类名Sales_data
,指明该构造函数属于类Sales_data
。注:构造函数名与类名相同。
不同于构造函数②③的函数体为空,以iostream
为参数的构造函数③需要执行实际操作,其函数体内调用了read
函数。read
函数中的this
参数将对象当作一个整体访问,而非直接访问对象中的某个成员。*this
解引用this
指针,获得执行该函数的对象,将该对象作为实参传递给read
函数。
其函数体内调用了read
函数。read
函数中的this
参数将对象当作一个整体访问,而非直接访问对象中的某个成员。*this
解引用this
指针,获得执行该函数的对象,将该对象作为实参传递给read
函数。