2015-11-04 1 views
-2

J'ai téléchargé un exemple sur le site BlackBerry. J'ai remarqué qu'ils ont des valeurs avant les accolades, et après un deux-points, séparés par des virgules.C++, quelle est la différence entre le point-virgule et les accolades

À quoi servent-ils et comment fonctionnent-ils? Editer: Est-ce juste une autre façon d'instancier des valeurs? La même chose que de définir ces valeurs à l'intérieur des accolades?

using namespace bb::cascades; 
using namespace bb::pim::contacts; 

//! [0] 
AddressBook::AddressBook(QObject *parent) 
    : QObject(parent) 
    , m_contactService(new ContactService(this)) 
    , m_model(new GroupDataModel(this)) 
    , m_contactViewer(new ContactViewer(m_contactService, this)) 
    , m_contactEditor(new ContactEditor(m_contactService, this)) 
    , m_currentContactId(-1) 
{ 
    // Disable grouping in data model 
    m_model->setGrouping(ItemGrouping::None); 

    // Ensure to invoke the filterContacts() method whenever a contact has been added, changed or removed 
    bool ok = connect(m_contactService, SIGNAL(contactsAdded(QList<int>)), SLOT(filterContacts())); 
    Q_ASSERT(ok); 
    ok = connect(m_contactService, SIGNAL(contactsChanged(QList<int>)), SLOT(filterContacts())); 
    Q_ASSERT(ok); 
    ok = connect(m_contactService, SIGNAL(contactsDeleted(QList<int>)), SLOT(filterContacts())); 
    Q_ASSERT(ok); 

    // Fill the data model with contacts initially 
    filterContacts(); 
} 
+2

[Liste d'initialisation du constructeur] (http://en.cppreference.com/w/cpp/language/initializer_list). – 101010

+2

Ce n'est pas un point-virgule, c'est un deux-points. – Galik

+1

Les quatre premiers google hits pour "constructor colon" pointent vers les réponses à cette question sur ce même site. DuckDuckGo et Bing auraient aussi fonctionné si vous n'aimez pas Google, tout comme "[C++] constructor colon" dans la recherche SO. Downvoted pour le manque d'effort de recherche. –

Répondre

5

C'est une liste d'initialisation de membre (et c'est un deux-points, pas un point-virgule).

Il initialise le membre avec la valeur entre parenthèses, donc (par exemple) m_contactService(new ContactService(this)) est approximativement le même que si vous mettez m_contactService = new ContactService(this); dans le corps du constructeur.

Il existe cependant quelques différences: la liste des initialiseurs de membres s'initialise réellement au lieu d'attribuer une valeur. Cela signifie qu'il peut être utilisé pour des éléments tels que les valeurs const, la classe de base et les références auxquelles l'affectation n'est pas autorisée.

+0

Génial, bonne explication! –

1

Ce sont des listes d'initialisation de membre.

Ils sont utilisés pour initialiser les membres d'un objet. Noter la différence entre initialisation et affectation. Vous pouvez également "initialiser" les membres dans le constructeur, mais ce serait en fait une affectation. Cela signifie que le membre aurait été initialisé (construit par défaut) au préalable. L'utilisation d'une liste d'initialisation de membre est plus efficace que l'affectation dans le constructeur et est de bon style C++.