• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Konstrukcja konstruktora.

Object Storage Arubacloud
0 głosów
199 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez nemezisso Użytkownik (860 p.)

Witam.

Mam taką klasę, taką jak poniżej i nie rozumiem działania w niej tego konstruktora. Sam doszedłem do tego, że działa to analogicznie jak: Osoba(string i, string n){imie=i;nazwisko=n;}. Czym różnią się te zapisy, którego powinno się używać?

class Osoba
{
string imie;
string nazwisko;
public:
Osoba(string imie, string nazwisko): imie(imie), nazwisko(nazwisko){ }
string Imie(){return imie;}
string Nazwisko(){return nazwisko;}
void PrzedstawSie()
{cout<< "Jestem: "<< Imie() << " "<< Nazwisko() << endl;}
};

 

2 odpowiedzi

+1 głos
odpowiedź 30 grudnia 2015 przez Radfler VIP (101,030 p.)
wybrane 30 grudnia 2015 przez nemezisso
 
Najlepsza
Osoba(std::string imie, std::string nazwisko)
: imie(imie), nazwisko(nazwisko) { }

Jest to lista inicjalizacyjna konstruktora. W tym miejscu obiekty są tworzone, tz. wywoływane są ich konstruktory.

Jak dla mnie lepsza jest lista inicjalizacyjna, gdyż wywołujesz konstruktor obiektu (który może przyjmować wiele argumentów), a nie operator przypisania. Poza tym na liście inicjalizacyjnej możesz inicjalizować referencje i stałe, możesz wywoływać konstruktory klas bazowych, możesz delegować konstruktory itp.

komentarz 30 grudnia 2015 przez nemezisso Użytkownik (860 p.)
Dzięki. Wygląda na to, że muszę poczytać na temat list inicjalizacyjnych :P
komentarz 30 grudnia 2015 przez Radfler VIP (101,030 p.)

Zapraszam na cppreference.com, bardzo przyjemnie się czyta: http://en.cppreference.com/w/cpp/language/initializer_list

0 głosów
odpowiedź 30 grudnia 2015 przez Melchior Obywatel (1,300 p.)
edycja 30 grudnia 2015 przez Melchior

Jest to konstruktor, który inicjalizuje referencje albo zmienną typu const, np 

class Cos
{
	const string x;
	string y;
	Cos() : x("aa")  
	{            
		y = "bb";
	}

};

Ta wartosc const powstaje przed dzialaniem konstruktora, dlatego zapis 

class Cos
{
	const string x;
	string y;
	Cos()
	{            
		x = "aa";
		y = "bb";
	}

};

bylby bledny

komentarz 30 grudnia 2015 przez Radfler VIP (101,030 p.)

Nawet w C++14 inicjalizacja stałych składowych nie jest możliwa poza listą inicjalizacyjną konstruktora lub przypisaniem w klasie.

#include <string>

struct Foo {

  const std::string text;

  Foo() {

    text = "const std:string Foo::text";

  }

};

int main() { }

/*
main.cpp: In constructor 'Foo::Foo()':
main.cpp:9:10: error: passing 'const string {aka const std::__cxx11::basic_string<char>}' as 'this' argument discards qualifiers [-fpermissive]
     text = "const std:string Foo::text";
          ^
In file included from /usr/local/include/c++/5.2.0/string:52:0,
                 from main.cpp:1:
/usr/local/include/c++/5.2.0/bits/basic_string.h:559:7: note:   in call to 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits<char> _Alloc = std::allocator<char>]'
       operator=(const _CharT* __s)
*/

 

Podobne pytania

0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 5 lipca 2017 w C i C++ przez excavelty Bywalec (2,480 p.)
0 głosów
1 odpowiedź 213 wizyt
0 głosów
2 odpowiedzi 924 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...