本文共 1789 字,大约阅读时间需要 5 分钟。
构造函数(C++ Primer学习)
构造函数是C++中类的成员函数,用于初始化类对象的数据成员。它的作用是为对象的数据成员分配初始值,确保对象在创建时处于预期状态。
构造函数具有以下几个特点:
合成的默认构造函数
编译器会隐式地为类创建一个默认构造函数,无需任何参数。这个默认构造函数只适用于非常简单的类。
默认构造函数的初始化规则是:
对于普通的类(不是非常简单的类),我们需要自己定义默认构造函数,原因如下:
定义构造函数(以Sales_data类为例)
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;};
定义默认构造函数的方式如下:
Sales_data() = default; // ①
通过在参数列表后加= default
,要求编译器生成构造参数。如果Sales_data类不支持类内初始值(例如,没有unsigned units_sold = 0;
和double revenue = 0.0;
),则默认构造函数对类来说并不起作用,此时需要利用构造函数初始化列表为内置类型成员进行初始化。
定义其他构造函数的方式如下:
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;
),则构造函数②是错误的,应使用构造函数③。
在类的外部定义构造函数的方式如下:
Sales_data::Sales_data(std::istream& is) { // ④ read(is, *this);}
当构造函数定义在类的外部时,必须明确指明其属于哪个类的成员。Sales_data::Sales_data
表示构造函数属于Sales_data类。
与构造函数②和③不同,构造函数④的函数体不为空。该构造函数接受一个std::istream参数,并调用read函数读取交易信息并存入对象中。*this
解引用this
指针,获取执行构造函数的对象,然后将该对象作为实参传递给read函数。
转载地址:http://nerfk.baihongyu.com/