在实际开发中,我们可能遇到一个问题:对于一个类,我们可能需要传递给它不同的参数,让它执行不同的行为;或者在使用旧的类时,我们希望加上一个新的参数,但是这个参数在旧的逻辑中不使用,需要在新的逻辑中使用,如果我们改了这个类,会导致使用旧的类的函数同步修改,这是我们不希望的,因为谁都不希望重构旧的代码(。。。)
遇到以上情况,更多时我们会重新写一个方法或者干脆新建一个类,但是如果你需要使用老的类中的函数并且老的函数大量重复,这就会造成代码冗余,遇到这个问题,其实我们可以考虑重载构造函数,使用多个构造函数达到这个目的。声明类传入不同的参数即可达到目的。
如下:
calculate.h文件
#ifndef CALCULATE_H
#define CALCULATE_H
#include <QObject>
class calculate : public QObject
{
Q_OBJECT
public:
calculate(QObject *parent = 0);//传入qobject
calculate(int a, int b, QObject *parent = 0);//传入int和qobject
calculate(int a);//只传入int
calculate(int a, double b, QObject *parent = 0);//传入int double和qobject
};
#endif // CALCULATE_H
calculate.cpp文件
#include "calculate.h"
#include <QDebug>
calculate::calculate(QObject *parent) : QObject(parent)
{
qDebug() << "nothing";
}
calculate::calculate(int a, int b, QObject *parent) : QObject(parent)
{
qDebug() << "a + b = " << (a+b);
}
calculate::calculate(int a)
{
qDebug() << "a = " << (a);
}
calculate::calculate(int a, double b, QObject *parent) : QObject(parent)
{
qDebug() << "a + double b = " << (a+b);
}
需要注意的是函数声明,你需要传入你想要的构造函数的参数,参数不能少,也不能多,顺序和类型、数量必须完全一致,否则编译器可能会选择错构造函数,如下:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
m_cal(new calculate(parent))
{
ui->setupUi(this);
calculate *m_cal1 = new calculate(1);
calculate *m_cal2 = new calculate(1,2,NULL);
calculate *m_cal3 = new calculate(1,2.0,NULL);
}
结果如下:
理解起来并不难:你可以把构造函数重载看成多胞胎,这几个孩子长得类似,但是一个需要苹果才和你玩,一个需要苹果和桃子才和你玩,一个需要桃子和李子才和你玩,你要找对应的孩子玩,就要拿出他们想要的东西才可以。
你只拿出苹果,省略了桃子,那么你只能叫出“需要苹果”的孩子,编译器这个“家长”肯定不会把“需要苹果和桃子”的孩子分派给你玩。