1.一个引例
//class head class complex //class body {} { public: complex(double r=0, double i) :re(r), im(i) {}//构造函数 complex& operator += (const complex&); double real() const { return re; }//获取实部的函数 double imag() const { return im; }//获取虚部的函数 private: double re, im; friend complex& __doapl(complex*, const complex&); };
2.构造函数的特点
- 构造函数名称与类名相同;
- 没有任何返回值类型,因为不需要;
- 可以用初始列的方式定义默认实参;
3.初始列定义构造函数默认实参
注意,一般的函数也是可以定义默认实参的,以下就是一个通用的方式
complex (double r = 0, dobule i = 0) { re = r; im = i;} //赋值语句
然而,上面的方式效率不是最高的。一般地,数据处理有两个阶段,即“初始化”和“赋值”,上面的方式直接跳过了阶段一,效率偏低。
对于构造函数,可以使用初始列(初值列)的方式来定义默认实参,充分利用这种特殊性。
complex ( double r = 0, double i = 0) : re(r), im(i) //初值列 {}
4.构造函数的调用
4.1设定了默认实参
#include <iostream> using namespace std; class complex //class body {} { public: complex(double r = 0, double i = 0) :re(r), im(i) {}//构造函数 complex& operator += (const complex&); double real() const { return re; }//获取实部的函数 double imag() const { return im; }//获取虚部的函数 private: double re, im; friend complex& __doapl(complex*, const complex&); }; int main() { complex c1(2, 1); //方法一:传递两个参数 complex c2; //方法二:不传递参数,因为有设定默认参数 cout << "c1=" << c1.real() << "+" << c1.imag() << "i" << endl; cout << "c2=" << c2.real() << "+" << c2.imag() << "i" << endl; return 0; }
4.2 未设定默认实参
此时,只支持方法一调用,不支持方法二调用。