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

C++ obiektowe, zastosowanie konstruktora - różnice w sposobach implementacji

VPS Starter Arubacloud
0 głosów
267 wizyt
pytanie zadane 23 października 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Mam takie pytanie do bardziej doświadczonych. smiley Mam kod programu C++, który zbudowany jest z jednej klasy Auta. Kod programu wygląda tak:

#include <iostream>
using namespace std;

//od tego miejsca prototyp klasy

class Auta
{
private:
    std::string marka_;
    std::string model_;
    int rok_produkcji_;
    float pojemnosc_silnika_;
    int ilosc_koni_mechanicznych_;
    int cena_netto_;
    int cena_brutto_;
    void obliczenie_ceny_brutto()
    {
        cena_brutto_ = cena_netto_ * 1.22;
    }
public:
    Auta(); //prototyp konstruktora domyślnego
    Auta(std::string marka, std::string model, int rok, float poj, int konie, int netto);
    ~Auta();
    void get_car();
    void show();
};

//od tego miejsca funkcja glowna main

int main()
{
    {
        Auta auto1;
        auto1.get_car();
        auto1.show();
    }
    {
        Auta car1("fiat", "126p", 1985, 0.65, 24, 200);
        car1.show();
    }
    return 0;
}

//od tego miejsca definicje funkcji, konstruktorów, destruktora

Auta::Auta()
{
    marka_ = "bez nazwy";
    model_ = "bez nazwy";
    rok_produkcji_ = 0;
    pojemnosc_silnika_ = 0.0;
    ilosc_koni_mechanicznych_ = 0;
    cena_netto_ = 0;
}

Auta::Auta(std::string marka, std::string model, int rok, float poj, int konie, int netto)
{
    marka_ = marka;
    model_ = model;
    rok_produkcji_ = rok;
    pojemnosc_silnika_ = poj;
    ilosc_koni_mechanicznych_ = konie;
    cena_netto_ = netto;
    obliczenie_ceny_brutto();
}

Auta::~Auta()
{
}
void Auta::get_car()
{
    cout << "Podaj marke samochodu, jaki chcesz kupic: ";
    cin >> marka_;
    cout << "Podaj model samochodu: ";
    cin >> model_;
    cout << "Podaj rok produkcji: ";
    cin >> rok_produkcji_;
    cout << "Podaj pojemnosc silnika: ";
    cin >> pojemnosc_silnika_;
    cout << "Podaj ilosc koni mechanicznych: ";
    cin >> ilosc_koni_mechanicznych_;
    cout << "Podaj cene tego auta: ";
    cin >> cena_netto_;

}

void Auta::show()
{
    cout << endl;
    cout << "Marka auta: " << marka_ << endl;
    cout << "Model auta: " << model_ << endl;
    cout << "Rok produkcji: " << rok_produkcji_ << endl;
    cout << "Pojemnosc silnika: " << pojemnosc_silnika_ << endl;
    cout << "Ilosc koni mechanicznych: " << ilosc_koni_mechanicznych_ << endl;
    cout << "Cena netto: " << cena_netto_ << "zl" << endl;
    obliczenie_ceny_brutto();
    cout << "Cena brutto: " << cena_brutto_ << "zl" << endl;
    cout << endl;
}

I teraz moje pytanie z tym związane. Jaka jest różnica między tworzeniem obiektów i operowaniem nimi jednym sposobem za pomocą:

        Auta auto1;
        auto1.get_car();
        auto1.show();

A drugim sposobem za pomocą konstruktora:

        Auta car1("fiat", "126p", 1985, 0.65, 24, 200);
        car1.show();

Jedną zasadniczą różnicę widzę sam. Jest nią to, że w przypadku pierwszym to użytkownik podaje odpowiednie wartości do zmiennych takie jak model auta, jego rok produkcji itd. A w drugim przypadku to my sami pisząc program od razu narzucamy wszystkie parametry za pomocą konstruktora. Potem możemy użyć destruktora tak jak się to dzieje w programie (bo po wyjściu z bloku destruktor automatycznie działa), aby wyczyścić ten obiekt z pamięci. Czyli mamy kolejną różnicę. Czyścimy pamięć w ten sposób i pozbywamy się tego obiektu. Może to być przydatne w jakiś grach. Ale czy można usunąć taki obiekt korzystając z pierwszego sposobu, gdzie to użytkownik podaje dane samochodu? Jest może jakaś funkcja delete, która nam to obsłuży? I jakie są inne różnice w tych dwóch sposobach operowaniem nad obiektami?

2 odpowiedzi

+1 głos
odpowiedź 23 października 2016 przez Ehlert Ekspert (212,630 p.)
wybrane 23 października 2016 przez Evelek
 
Najlepsza

Twoja implementacja jest rzadka. Niezbyt często się zdarza, żeby obiekt miał metodę która czyta z klawiatury i nadaje wartości polom. Do tego jest konstruktor. Przypadek w którym instancja klasy jest tworzona przez samą siebie to chyba tylko singleton. 

Co do usuwania poczytaj o destruktorze. Ogarnij kiedy go wywołać, żeby nie wykrzaczył się program.

Lista inicjalizacyjna

Co do tworzenia obiektu to jest wiele metod ale bardzo często spotkasz się z:

  1. Fabryka abstrakcyjna
  2. Budowniczy
  3. Singleton
komentarz 23 października 2016 przez Evelek Nałogowiec (28,960 p.)

Niezbyt często się tak zdarza... widocznie klasy i obiekty mają inne lepsze zastosowanie o którym jeszcze mi nie przyszło się dowiedzieć. smiley Na chwilę obecną w celach edukacyjnych piszę sobie takie to proste programy, a jeszcze duuużo przede mną jak widać.

Dziękuję za te metody tworzenia obiektu. Zapoznam się oczywiście z nimi i je przeanalizuje, ale już teraz widzę, że nieco przekraczają mój poziom wiedzy.

+1 głos
odpowiedź 23 października 2016 przez Myśliwy Gaduła (3,080 p.)
Jest coś takiego jak operator new oraz delete, służą one do dynamicznego tworzenia i usuwania obiektów np. int* x= new int; w ten sposób otrzymujesz wskaźnik x do obiektu int, delete używa się troche prościej -> delete x; delete od razu wywołuje destruktor obiektu int, którego wskaźnikiem jest x.

Dynamiczne alokowanie pamięci
komentarz 23 października 2016 przez Evelek Nałogowiec (28,960 p.)

Popracuję nad tym, bo jeszcze nie próbowałem wrzucać do obiektów klas, ich metod itd. operatorów new i delete. smiley Dziękuje za wypowiedź.

Podobne pytania

0 głosów
2 odpowiedzi 196 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez nemezisso Użytkownik (860 p.)
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

92,453 zapytań

141,262 odpowiedzi

319,086 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!

...