1. 程式人生 > >C++中帶有預設引數的宣告和定義。Qt中重寫預設建構函式。C++中函式呼叫時實參個數和函式定義時的形參個數不一致時的處理。

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);
}

注意:函式定義時的函式列表中都不能帶有預設值。