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

[C++] Konstrukcja konstruktora.

VPS Starter Arubacloud
0 głosów
196 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ź 118 wizyt
pytanie zadane 5 lipca 2017 w C i C++ przez excavelty Bywalec (2,480 p.)
0 głosów
1 odpowiedź 201 wizyt
0 głosów
2 odpowiedzi 914 wizyt

92,454 zapytań

141,262 odpowiedzi

319,093 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...