初始化一个不存在的类成员?

时间:2014-02-03 14:54:02

标签: c++ initialization

这是代码(来自c ++中使用qt4的设计模式的介绍),在第9行,我猜QString(other)给出了一个QString对象,但是这里初始化了什么?

#include <QList>
#include <QtAlgorithms>   // for qSort()
#include <QStringList>
#include <QDebug>

class CaseIgnoreString : public QString {
public:
    CaseIgnoreString(const QString& other = QString())
    : QString(other) {} //  
    bool operator<(const QString & other) const {
        return toLower() < other.toLower();
    }
    bool operator==(const QString& other) const {
        return toLower() == other.toLower();
    }
};

int main() {
    CaseIgnoreString s1("Apple"), s2("bear"),
                     s3 ("CaT"), s4("dog"), s5 ("Dog");

    Q_ASSERT(s4 == s5);
    Q_ASSERT(s2 < s3);
    Q_ASSERT(s3 < s4);

    QList<CaseIgnoreString> namelist;

    namelist << s5 << s1 << s3 << s4 << s2; /* Insert
        all items in an order that is definitely not sorted. */

    qSort(namelist.begin(), namelist.end());
    int i=0;
    foreach (const QString &stritr, namelist) {
        qDebug() << QString("namelist[%1] = %2")
                       .arg(i++).arg(stritr) ;
    }

    QStringList strlist;
    strlist << s5 << s1 << s3 << s4 << s2; /* The value
       collection holds QString but, if you add CaseIgnoreString,
       a conversion is required. */

    qSort(strlist.begin(), strlist.end());
    qDebug() << "StringList sorted: " + strlist.join(", ");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

它不是成员的初始化,而是对基类初始化的显式调用。有关详细说明,请参阅Why explicitly call a constructor in C++

答案 1 :(得分:0)

在此构造函数中

CaseIgnoreString(const QString& other = QString())
: QString(other) {} //  

参数other的默认参数。如果用户不指定参数,则编译器将使用通过调用构造函数QString()创建的临时对象初始化参数。 此参数用于通过使用ctor初始化列表初始化CaseIgnoreString的基类

: QString(other)