- 构造函数(constructor)是一个特殊的类方法,它是在初始化对象时调用的类中的方法。有以下几个关键点:
- 构造函数调用时可以对类中的属性赋值以及输出相应的提示语句
- 构造函数无返回类型和返回值
- 一个类可以拥有多个构造函数
例如下面的程序:
#include <iostream>
using namespace std;
class Complex{
double re;
double im;
public:
Complex(const double r, const double i){ //带参数的构造函数
cout << "调用构造函数:\n";
re = r;
im = i;
}
string text(){
stringstream ss;
ss << re << " + " << im << "j";
return ss.str();
}
};
int main(){
Complex a = {1.0, 2.0}; //此处调用构造函数Complex
cout << "a = " << a.text();
Complex b = {4.0, 5.0}; //再次调用构造函数Complex
cout << "b = " << b.text();
}
输出结果:
上述函数中,并没有调用Complex但复数a和b的实部和虚部却被自动分配好了,这就是构造函数,在类被实例化(即分配对象时)被自动调用。如果一个类中没有构造函数,则编译系统会默认补上一个空的构造函数。但是如果自行在类中添加了构造函数,系统将不会自动再补一个构造函数。因此,如果有构造函数存在,那么对类实例化时必须与构造函数的格式相同。例如:
#include <iostream>
using namespace std;
class Complex{
double re;
double im;
public:
Complex(const double r, const double i){
cout << "调用构造函数\n";
re = r;
im = i;
}
double getReal() const{
return re;
}
double getImag() const{
return im;
}
Complex mul(const Complex& z){
Complex s; //此处将产生编译错误,因为这里实例化类Complex时和构造函数的格式不一样
Complex s = {0.0, 0.0}; //这种格式正确
s.re = re * z.getReal() - im * z.getImag();
s.im = re * z.getImag() + im * z.getReal();
}
int main(){
}
一个类中可以拥有多个构造函数。例如下面的程序,用以求一个复数的模以及与另一个复数相乘的结果:
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;
class Complex{
double re;
double im;
public:
Complex(){
cout << "调用默认构造函数\n";
}
Complex(const double r, const double i){ //带参数的构造函数
cout << "调用构造函数:\n";
re = r;
im = i;
}
void setValue(const double r, const double i){
re = r;
im = i;
}
double getReal()const{
return re;
}
double getImag()const{
return im;
}
double amount(){ //计算模
return sqrt(re * re + im * im);
}
Complex mul(const Complex& z){
Complex s; //这里将调用默认构造函数
s.setValue((re * z.getReal() - im * z.getImag()), (re * z.getImag() + im * z.getReal()));
return s;
}
string text(){
stringstream ss;
ss << re << " + " << im << "j" << endl;
return ss.str();
}
};
int main(){
Complex a = {1.0, 2.0}; //此处调用构造函数Complex
cout << "a = " << a.text();
Complex b = {4.0, 5.0}; //再次调用构造函数Complex
cout << "b = " << b.text();
Complex c; //这里将调用默认构造函数
c = a.mul(b);
cout << "c = " << c.text();
}
输出结果:
以上函数两个构造函数分别调用了两次,这就是构造函数的多种不同构造。
如有错误,欢迎大家批评与指正!