2016-12-18 7 views
18

Właśnie przeglądałem kod źródłowy biblioteki, gdy ją napotkałem.Zrozumienie dziwnej składni za pomocą nawiasów klamrowych na liście inicjalizatora konstruktora

nie rozumiem składni

m_font{..} 

Co to jest? Co to robi. Przepraszam, jeśli to naprawdę głupie pytanie. Nie wiem, co Google, więc zapytaj tutaj.

+3

spróbuj googling: lista inicjalizatorów nawiasy klamrowe – Shloim

+0

Pytasz o listę klamrową inicjalizatora, czy pytasz o make_shared? Współdzielone wskaźniki Google, jeśli to drugie. –

+0

Tutaj: http: // stackoverflow.com/pytania/24953658/ – Ynon

Odpowiedz

16

Jest to opisane na cppreference, ale w nieco trudne do odczytania format:

Ciało definicji funkcji jakiegokolwiek konstruktora przed nawiasem otwierającym instrukcji złożonej, może obejmować inicjator użytkownika Lista, którego składni postać okrężnicy :, a następnie oddzielone przecinkami jednego lub większej liczby członków -inicjalizatorów, z których każdy ma następującą składnię

...

klasy lub identyfikator-Brace-startowe lista (2) (od C++ 11)

...

2) Inicjuje bazę lub członka nazwany przez wykładowa lub-identyfikator użyciu list-inicjalizacji (który staje wartość inicjalizacji gdy lista jest pusta i agregatów inicjalizacji gdy inicjalizacja agregat)

Co to próbuje powiedzieć, że X::X(...) : some_member{some_expressions} { ... } powoduje, że element klasy some_member jest inicjowany z poziomu some_expressions. Biorąc

struct X { 
    Y y; 
    X() : y{3} {} 
}; 

dane członkiem y zostaną zainicjowane w ten sam sposób lokalna zmienna Y y{3}; zostanie zainicjowany.

W twoim przypadku std::make_shared<sf::Font>(font) generuje wartość, która zostanie użyta do zainicjowania elementu klasy m_font.

+5

Nasuwa się pytanie, co-the-różnice pomiędzy c-Like-konstruktora-and-jednolitej inicjalizacji are-: Dlaczego należałoby użyć nawiasów zamiast nawiasu do inicjalizacji? –

+2

@wingleader Patrz [to pytanie] (http://stackoverflow.com/questions/24953658/what-are-the-differences-between-c-like-constructor-and-uniform-initialization). – Blackhole

9

To jest lista inicjatora nawiasów klamrowych list initialization. Dokładniej, w tym przypadku jest to inicjowanie listy bezpośredniej.

Zasadniczo zmienna m_font jest inicjowany z wartością, która jest podana w nawiasach klamrowych, w tym przypadku jest to zainicjowany na shared_ptr dla obiektu font który jest dany do konstruktora.

7

Klasa Font ma człon zwany m_font typu std::shared_ptr<sf::Font>, więc w konstruktorze klasy Font że członek jest inicjowane z udostępnionego wskaźnik do font.

Powiązane problemy