Wpis z mikrobloga

Pytanie z C++:
Jaka jest różnica (poza wyglądem oczywiście) między nawiasami okrągłymi (up) a nawiasami klamrowymi {down} na liście inicjalizacyjnej konstruktora?

class Wykop
{
Wykop(int up, int down) : wykopali(up), zakopali{down} {}
int wykopali;
int zakopali;
}

#programowanie #cpp
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@CCCCC: w tym konkretnym przykładzie niczym się nie różni, a całość zadziała tak, że obie zmienne zainicjalizują się wartościami przekazanymi do konstruktora(up & down). Masz tu po prostu pomieszaną inicjalizację starego typu i nowego(uniform init.). Nastaw się raczej na nową, nie tylko w konstruktorach ale też przy tworzeniu obiektów, bo unikniesz dzięki temu błędów w postaci deklaracji funkcji zamiast inicjalizacji obiektów.

P.S. Całość z przykładu nie zadziała, jeśli będziesz chciał
  • Odpowiedz
@enceladus71 ale nowy sposób inicjalizacji nie jest zawsze najlepszy. Jeśli w klasę mamy konstruktor z argumentem initializerlist to inicjalizacja obiektu obiekt{5} uruchomi konstruktor z initializerlist a nir z jednym parametrem int.

@CCCCC ogólnie różnica jest taka, że z klamrami to nowy sposób a z nawiasami stary. Przy stosowaniu klamr dodatkowo występuje ochrona przed zwężenien typu: czyli masz jeden konstruktor z intem to przy obiekt{5.5} będzie błąd a przy
  • Odpowiedz
@enceladus71 No tak to ma działać. Bo podczas operatora=, szukany jest konstruktor najbardziej pasujący i dla jednej wartości int uruchomi z jednym parametrem int, ciekawe, że jak dasz test t3 = 5.5 to uruchomi też konstruktor w intem i przypisze 5. Aby zapobiec takim konwersją, do konstruktora trzeba dodać słówko explicit i samemu dodać operatory konwersji np. operator double() itp.
  • Odpowiedz