40 / 90

C++ Constructors

C++ konstruktorlari

Konstruktor function maxsus a'zosi bo'lib, object yaratilganda avtomatik ravishda chaqiriladi.

C++ da konstruktor class nomi bilan bir xil nomga ega va uning qaytish turi yo'q. Masalan,

example.cpp
class  Wall {
  public:
    // konstruktor yarating
    Wall() {
      // kod
    }
};

Bu erda Wall() funksiyasi Wall sinfining konstruktoridir. E'tibor bering, konstruktor

  • sinf bilan bir xil nomga ega,
  • qaytish turiga ega emas va -public hisoblanadi

C++ standart konstruktori

Parametrlari bo'lmagan konstruktor standart konstruktor sifatida tanilgan. Masalan,

example.cpp
// Standart konstruktordan foydalanishni ko'rsatish uchun C++ dasturi

#include <iostream>
using namespace std;

// sinf e'lon qilish
class  Wall {
  private:
    double length;

  public:
    // o'zgaruvchini ishga tushirish uchun standart konstruktor
    Wall()
      : length{5.5} {
      cout << "Creating a wall." << endl;
      cout << "Length = " << length << endl;
    }
};

int main() {
  Wall wall1;
  return 0;
}

Chiqish

kod
Creating a Wall
Length = 5.5

Bu yerda wall1 obyekti yaratilganda Wall() konstruktori chaqiriladi. length{5.5} konstruktor chaqirilganda chaqiriladi va ob'ektning variable uzunligini 5.5 ga o'rnatadi.

[!NOTE] Agar biz sinfimizda konstruktor, nusxa ko'chirish yoki ko'chirish konstruktorini aniqlamagan bo'lsak, u holda C++ kompilyatori avtomatik ravishda parametrlari va bo'sh tanasi bo'lgan standart konstruktorni yaratadi.

Standart konstruktor

Sinfning a'zo o'zgaruvchilarini ishga tushirish uchun standart konstruktorga tayanishimiz kerak bo'lganda, konstruktorni quyidagi tarzda sukut bo'yicha aniq belgilashimiz kerak:

example.cpp
Wall() = default;

Agar biz standart qiymatni o'rnatmoqchi bo'lsak, qiymatni ishga tushirishdan foydalanishimiz kerak. Ya'ni, a'zo o'zgaruvchilar deklaratsiyasida qavslar ichidagi standart qiymatni quyidagi tarzda kiritamiz.

example.cpp
double length {5.5};

Keling, misolni ko'rib chiqaylik:

example.cpp
// Standart konstruktordan foydalanishni ko'rsatish uchun C++ dasturi

#include <iostream>
using namespace std;

// sinf e'lon qilish
class  Wall {
  private:
    double length {5.5};

  public:
    // o'zgaruvchini ishga tushirish uchun standart konstruktor
    Wall() = default;
    
    void print_length() {
    	cout << "length = " << length << endl;
    }
};

int main() {
  Wall wall1;
  wall1.print_length();
  return 0;
}

Chiqish:

kod
length = 5.5

C++ parametrlangan konstruktor

C++ tilida parametrlarga ega konstruktor parametrlangan konstruktor sifatida tanilgan. Bu aʼzo maʼlumotlarini ishga tushirish uchun afzal qilingan usul. Masalan,

example.cpp
// Devorning maydonini hisoblash uchun C++ dasturi

#include <iostream>
using namespace std;

// sinf e'lon qilish
class Wall {
  private:
    double length;
    double height;

  public:
    // o'zgaruvchilarni ishga tushirish uchun parametrlangan konstruktor
    Wall(double len, double hgt)
      : length{len}
      , height{hgt} {
    }

    double calculateArea() {
      return length * height;
    }
};

int main() {
  // ob'ekt yaratish va ma'lumotlar a'zolarini ishga tushirish
  Wall wall1(10.5, 8.6);
  Wall wall2(8.5, 6.3);

  cout << "Area of Wall 1: " << wall1.calculateArea() << endl;
  cout << "Area of Wall 2: " << wall2.calculateArea();

  return 0;
}

Chiqish

kod
Area of Wall 1: 90.3
Area of Wall 2: 53.55

Bu erda biz ikkita parametrga ega bo'lgan Wall() parametrli konstruktorini aniqladik: double len va double hgt . Ushbu parametrlardagi qiymatlar a'zo o'zgaruvchilar uzunligi va balandligini ishga tushirish uchun ishlatiladi.

: length{len}, height{hgt} - a'zolarni ishga tushirish ro'yxati.

-length{len} a'zo o'zgaruvchi uzunligini len parametrining qiymati bilan ishga tushiradi -height{hgt} element o'zgaruvchan balandligini hgt parametrining qiymati bilan ishga tushiradi.

Wall sinfining ob'ektini yaratganimizda, biz a'zo o'zgaruvchilar uchun qiymatlarni argument sifatida beramiz. Buning uchun kod:

example.cpp
Wall wall1(10.5, 8.6);
Wall wall2(8.5, 6.3);

A'zo o'zgaruvchilari shu tarzda ishga tushirilganda, biz calculateArea() usuli bilan devor maydonini hisoblashimiz mumkin.

[!NOTE] Konstruktor birinchi navbatda ob'ektlarni ishga tushirish uchun ishlatiladi. Ular, shuningdek, ob'ekt yaratilganda standart kodni ishga tushirish uchun ishlatiladi.

C++ a'zolarni ishga tushirish ro'yxati

Konstruktorni ko'rib chiqing:

example.cpp
Wall(double len, double hgt)
  : length{len}
  , height{hgt} {
}

Bu yerga,

example.cpp
: length{len} 
,  height{hgt}

a'zolarni ishga tushirish ro'yxati.

A'zolarni ishga tushirish ro'yxati sinfning a'zo o'zgaruvchilarini ishga tushirish uchun ishlatiladi.

A'zo o'zgaruvchilarning tartibi yoki ishga tushirilishi ularning a'zolarni ishga tushirish ro'yxatidagi deklaratsiyasidan ko'ra sinfda e'lon qilish tartibiga mos keladi.

A'zo o'zgaruvchilar sinfda quyidagi tartibda e'lon qilinganligi sababli:

example.cpp
double length;
double height;

Agar biz konstruktorimizni quyidagicha aniqlasak ham, uzunlik o'zgaruvchisi birinchi bo'lib ishga tushiriladi:

example.cpp
Wall(double hgt, double len)
  : height{hgt}
  , length{len} {
}

C++ nusxa ko'chirish konstruktori

C++ tilidagi nusxa ko'chirish konstruktori ma'lumotlarni bir ob'ektdan ikkinchisiga nusxalash uchun ishlatiladi. Masalan,

example.cpp
#include <iostream>
using namespace std;

// sinf e'lon qilish
class Wall {
  private:
    double length;
    double height;

  public:

    // parametrlangan konstruktor bilan o'zgaruvchilarni ishga tushirish
    Wall(double len, double hgt)
      : length{len}
      , height{hgt} {
    }

    // Parametr sifatida Wall ob'ekti bilan konstruktorni nusxalash
    // obj parametrining ma'lumotlarini nusxalaydi
    Wall(const Wall& obj)
      : length{obj.length}
      , height{obj.height} {
    }

    double calculateArea() {
      return length * height;
    }
};

int main() {
  // Wall sinfining ob'ektini yaratish
  Wall wall1(10.5, 8.6);

  // devor1 tarkibini devorga2 nusxalash
  Wall wall2 = wall1;

  // devor1 va devor2 maydonlarini chop etish
  cout << "Area of Wall 1: " << wall1.calculateArea() << endl;
  cout << "Area of Wall 2: " << wall2.calculateArea();

  return 0;
}

Chiqish

kod
Area of Wall 1: 90.3
Area of Wall 2: 90.3

Ushbu dasturda biz Wall sinfidagi bir ob'ektning mazmunini boshqasiga nusxalash uchun nusxa ko'chirish konstruktoridan foydalanganmiz. Nusxalash konstruktorining kodi:

example.cpp
Wall(const Wall& obj)
    : length{obj.length}
    , height{obj.height} {
}

E'tibor bering, ushbu konstruktorning parametri Wall sinfi ob'ektining manziliga ega.

Keyin obj ob'ektining o'zgaruvchilari qiymatlarini ob'ektning mos keladigan o'zgaruvchilariga belgilaymiz, nusxa ko'chirish konstruktorini chaqiramiz. Ob'ektning mazmuni shu tarzda ko'chiriladi.

main() da biz devor1 va devor2 ikkita ob'ektni yaratamiz va keyin devor1 tarkibini devor2 ga nusxalaymiz:

example.cpp
// devor1 tarkibini devorga2 nusxalash
Wall wall2 = wall1;

Bu erda wall2 ob'ekti wall1 ob'ektining havolasini o'z argumenti sifatida o'tkazish orqali o'zining nusxa konstruktorini chaqiradi.

C++ standart nusxasi konstruktori

Agar biz sinfimizda nusxa ko'chirish konstruktorini, ko'chirish konstruktorini yoki ko'chirish topshirig'ini aniqlamasak, u holda C++ kompilyatori avtomatik ravishda a'zolar bo'yicha nusxa ko'chirish topshirig'ini bajaradigan standart nusxa konstruktorini yaratadi. Aksariyat hollarda bu etarli. Masalan,

example.cpp
#include <iostream>
using namespace std;

// sinf e'lon qilish
class Wall {
  private:
    double length;
    double height;

  public:

    // parametrlangan konstruktor bilan o'zgaruvchilarni ishga tushirish
    Wall(double len, double hgt)
      : length{len}
      , height{hgt} {
    }

    double calculateArea() {
      return length * height;
    }
};

int main() {
  // Wall sinfining ob'ektini yaratish
  Wall wall1(10.5, 8.6);

  // sukut bo'yicha nusxa ko'chirish konstruktori bo'yicha wall1 tarkibini wall2 ga nusxalash
  Wall wall2 = wall1;

  // devor1 va devor2 maydonlarini chop etish
  cout << "Area of Wall 1: " << wall1.calculateArea() << endl;
  cout << "Area of Wall 2: " << wall2.calculateArea();

  return 0;
}

Chiqish

kod
Area of Wall 1: 90.3
Area of Wall 2: 90.3

Ushbu dasturda biz nusxa ko'chirish konstruktorini aniqlamadik. Kompilyator Wall sinfidagi bir ob'ektning mazmunini boshqasiga nusxalash uchun standart nusxa ko'chirish konstruktoridan foydalangan.

Shuningdek oʻqing