接着上一节,继续总结构造函数,主要涉及到C++11中的委托构造函数,以及一些关于构造函数的常见面试题。
目录
- 默认构造函数的作用
- 委托构造函数
- 构造函数常见的面试题
默认构造函数的作用
当对象被默认初始化或值初始化时自动执行默认的构造函数。默认初始化在以下情况下发生:
当我们在块作用域内不使用任何初始值定义一个非静态变量或者数组;
当一个类本身含有类类型的成员且使用合成的默认构造函数时;
当类类型的成员没有在构造函数初始值列表中显示初始化。
而值初始化在以下情况下发生:
在数组初始化的过程中如果我们提供的初始值数量少于数组大小时;
当我们不使用初始值定义一个局部的静态变量;
当我们通过书写形如T()的表达式显示请求值初始化时,其中T类型,形如vector的一个构造函数只接受一个实参用于说明vector的大小;
使用默认构造函数
Sales_data obj1(); //声明一个函数而非对象
Sales_data obj; //声明一个对象
定义使用默认的构造函数进行初始化的对象,Sales_data obj; 其中obj是一个默认初始化对象。
委托构造函数
C++11新标准中扩展了构造函数初始值的功能,定义了所谓的委托构造函数。委托构造函数使用它所属的类的其他构造函数执行它自己的初始化过程,或者说它把它自己的一些或全部指责委托给其它的构造函数。如:
struct Sales_data
{
//非委托构造函数
Sales_data(const std::string &s, unsigned n, double p) : //三个参数
bookNo(s), units_sold(n), revenue(p*n) {}
//其余构造函数全都委托给另一个构造函数
Sales_data():Sales_data(" ", 0, 0) {}; //默认的构造函数委托给三个参数的构造函数
Sales_data(const std::string &s) :Sales_data(s,0,0) {}//一个参数委托构造函数三个参数的构造函数
Sales_data(std::istream &is):Sales_data() //将委托给默认的构造函数
{
read(is, *this);
}
std::string isbn() const { return bookNo; }//常量成员函数,不能修改对象内容
Sales_data& combine(const Sales_data&);//double avg_price() const;
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
程序中默认的构造函数和一个参数的构造函数委托给三个参数的构造函数,而接受istream &参数的构造函数又委托默认的构造函数。其中委托顺序下图所示。
构造函数常见的面试题
构造函数能否为虚函数?
构造函数不能为虚函数。因为虚函数采用的是一种虚调用的方法,而虚调用是一种可以在只知道部分信息的情况工作机制,特别允许我们调用一个只知道接口而不知道准备对象类型的函数。但是,创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚函数。
构造函数是否为内联函数?
构造函数可以在类内或类外,如果构造函数位于类内部,就是内联函数;若在类外,并且没有inline关键字,就一定不是内联函数,如果在类外有关联字(inline),只能说建议编译器将此函数设为内联函数,至于最终是不是内联函数由编译器决定。内联函数是编译时展开,并做类型安全检查。