C++中带有默认参数的声明和定义。Qt中重写默认构造函数。C++中函数调用时实参个数和函数定义时的形参个数不一致时的处理。

1、Qt中自动生成的构造函数

(1)Qt中自动生成的构造函数的声明

class Chat : public QWidget
{
    Q_OBJECT

public:
    explicit Chat(QWidget *parent = 0); //声明构造函数,可以带有初始值“=0”,表该参数为默认参数且调用时该参数可省略
    ~Chat();

private:
    Ui::Chat *ui;
};

其中 “explicit Chat(QWidget *parent = 0);”为声明的构造函数,QWidget *parent = 0代表该参数为默认参数且调用时该参数可省略,即调用时该函数可以没有实参。

(2)Qt中自动生成的构造函数的定义

Chat::Chat(QWidget *parent) :    //构造函数的定义,注意不能带有初始值“=0”
    QWidget(parent),
    ui(new Ui::Chat)
{
    ui->setupUi(this);
}

其中,构造函数:Chat::Chat(QWidget *parent) : QWidget(parent),ui(new Ui::Chat){......}形式中,“::”前的Chat表示类名,“::”后的Chat为成员函数,其名称与类相同,表示该类的构造函数,(QWidget *parent)为该构造函数的参数,注意在定义时参数中不能带有初始值“=0”,只能在声明的时候有。“:”之后的部分为构造函数的初始化参数列表,其中QWidget(parent)为派生类Chat显式调用父类QWidget的构造函数,并传参,调用顺序是先调用父类构造函数,再调用派生类的构造函数,若不写调用父类的默认构造函数。 ui(new Ui::Chat)表示使用类内初始值对ui进行初始化,这部分可以放到函数体中实现,成为:

Chat::Chat(QWidget *parent ) :QWidget(parent)
{
    ui = new Ui::Chat;
    ui->setupUi(this);
}

2、重写Qt中的默认构造函数

(1)重写Qt中的默认构造函数的声明

class Chat : public QWidget
{
    Q_OBJECT

public:
    explicit Chat(QString destUser, QWidget *parent = 0);//注意:默认参数必须是函数参数列表中最右边的参数
    ~Chat();

private:
    Ui::Chat *ui;
};

注意:默认参数必须是函数参数列表中最右边的参数,在函数调用的时候可以省略,当调用该函数时若实参的个数和定义时形参的个数不一致时,默认是从左往右匹配,所以默认参数要放在函数列表的最右边。如:

void Widget::on_userTableWidget_doubleClicked(const QModelIndex &index)
{
    int row = index.row();                            //返回点击的行
    if(row != ui->userTableWidget->rowCount() - 1){
        QString destUser = ui->userTableWidget->item(row,0)->text();
        Chat *chat = new Chat(destUser);             //只传入一个类型为QString的实参,从左往右匹配
        chat->show();
    }else{
        QMessageBox::information(this, tr("提示"), tr("不能与自己聊天"));
    }
}

(2)重写Qt中的默认构造函数的定义

Chat::Chat(QString destUser, QWidget *parent ) ://注意:定义时都不能带有默认值
    QWidget(parent),
    ui(new Ui::Chat)
{
    qDebug()<<destUser;
    ui->setupUi(this);
}

注意:函数定义时的函数列表中都不能带有默认值。

猜你喜欢

转载自blog.csdn.net/King_weng/article/details/83721945
今日推荐