Istnieje subtelna, ale ważna różnica między tymi dwoma opcjami. To, co masz na górze, nazywa się listą inicjalizacji członków. Kiedy obiekt zostanie utworzony, członkowie z tej listy są inicjowani do tego, co umieściliście w nawiasie.
Kiedy robisz zadanie w ciele konstruktora, wartości są najpierw zainicjowany, a następnie przypisany. Opublikuję krótki przykład poniżej.
Przykład 1: inicjalizacja Użytkownik
class foo
{
public:
foo(char c, int i);
private:
char exampleChar;
int exampleInt;
Bar exampleBar;
};
foo::foo(char c, int i):
exampleChar(c),
exampleInt(i),
exampleBar() //Here, a bar is being default constructed
{
}
Przykład 2: Konstruktor Przypisanie
class foo
{
public:
foo(char c, int i, Bar b);
private:
char exampleChar;
int exampleInt;
Bar exampleBar;
};
foo::foo(char c, int i, Bar b):
//exampleChar(c),
//exampleInt(i),
//exampleBar()
{
exampleChar = c;
exampleInt = i;
exampleBar = someOtherBar; //Here, a bar is being assigned
}
To gdzie robi się ciekawie. Zauważ, że przypisywane jest exampleBar
. Poza kulisami, Bar
jest w pierwszej kolejności domyślnie skonstruowany, nawet jeśli tego nie określiłeś. Ponadto, jeśli twoja Bar
jest bardziej skomplikowana niż prosta struktura, musisz koniecznie zaimplementować operatora przypisania, abyś mógł go zainicjować w ten sposób. Co więcej, aby zainicjować Bar
z innego Bar
z listy inicjalizacji członków, musisz zaimplementować konstruktora kopiowania!
Przykład 3: Kopiowanie konstruktor stosowane w państwach init,
class foo
{
public:
foo(char c, int i, Bar b);
private:
char exampleChar;
int exampleInt;
Bar exampleBar;
};
foo::foo(char c, int i, Bar b):
//exampleChar(c),
//exampleInt(i),
exampleBar(b) //Here, a bar is being constructed using the copy constructor of Bar
{
exampleChar = c;
exampleInt = i;
}
"Ten kod ... nie przestrzega reguł, do których jestem przyzwyczajony w innych językach" Cóż, C++ nie jest jednym z tych języków. Jest wiele rzeczy w C++, które różnią się od "innych języków" (i, prawdopodobnie, jest wiele rzeczy w każdym z tych innych języków, które różnią się od innych z tych języków). –
bardzo podobne pytania: http://stackoverflow.com/questions/1598967/benefits-of-initialization-lists, http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member -initialization-list, http://stackoverflow.com/questions/4589237/c-initialization-lists, i prawdopodobnie znacznie więcej –