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

[C++] Konstrukcja konstruktora.

0 głosów
483 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ź 290 wizyt
pytanie zadane 5 lipca 2017 w C i C++ przez excavelty Bywalec (2,480 p.)
0 głosów
1 odpowiedź 476 wizyt
0 głosów
2 odpowiedzi 1,465 wizyt

93,800 zapytań

142,768 odpowiedzi

323,461 komentarzy

63,421 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...