§ 2. Класы

2.1. Структура класа

 

Нагадаем асноўныя паняцці, звязаныя з апісаннем класа. У прыкладзе 2.1 выкарыстоўваецца клас Student.

Імя класа прынята пісаць з вялікай літары. У агульным выглядзе апісанне класа выглядае наступным чынам:

class iмя_класа

{

  private:

  /* спіс уласцівасцей і метадаў для

  выкарыстання ўнутры класа */

  public:

  /* спіс метадаў, даступных іншым 

  функцыям і аб'ектам праграмы */

  protected:

  /*спіс сродкаў, даступных для 

  дружалюбных класаў і наследнікаў*/

};

Усе ўласцівасці і метады класаў маюць правы доступу. Па змоўчанні ўсё змесціва класа з'яўляецца даступным для чытання і запісу толькі для яго самога. Для таго каб дазволіць доступ да даных класа звонку, выкарыстоўваюць мадыфікатар доступу public. Усе функцыі і пераменныя, якія знаходзяцца пасля мадыфікатара public, становяцца даступнымі з усіх частак праграмы.

Закрытыя даныя класа размяшчаюцца пасля мадыфікатара доступу private. Калі адсутнічае мадыфікатар public, то ўсе функцыі і пераменныя па змоўчанні з'яўляюцца зачыненымі.

Звычайна прыватнымі робяць усе палі класа, а публічнымі — яго метады. Усе дзеянні з зачыненымі палямі класа рэалізуюцца праз яго метады.

Паколькі метад у класе з'яўляецца функцыяй, то і апісваюць метады гэтак жа, як апісваюць функцыі. Аб'яўляюць метады ўнутры класа, а вызначэнне метадаў можа быць як унутры класа, так і па-за ім. Вызначэнне метадаў па-за класа дазваляе пры неабходнасці лёгка вынесці іх у асобны файл.

Вызначэннi метадаў класа вельмі падобныя на звычайныя вызначэннi функцый. Кожны з метадаў мае загаловак і цела, можа мець тып значэння, якое вяртаецца, і параметры. Але ёсць і адрозненні:

  1. Пры вызначэнні функцыі як метаду класа выкарыстоўваецца значок «::»[1] для ідэнтыфікацыі класа, якому належыць функцыя.
  2. Метады класа маюць доступ да ўсіх прыватных кампанентаў свайго класа.

Паколькі даныя ў класе з'яўляюцца прыватнымі, карыстальнік не можа напрамую вызначыць ці змяніць значэннi даных. Для гэтых мэт выкарыстоўваюцца спецыяльныя метады.

У класах прынята аб'яўляць так званыя set- i get-функцыі (у рускамоўнай літаратуры іх часам называюць сетэры і гетэры), з дапамогай якіх можна працаваць з элементамі даных. Такіх функцый у класе можа быць некалькі.

На аб'екты класаў, як і на аб'екты іншых тыпаў, можна вызначаць паказальнікі. Затым праз паказальнік можна звяртацца да членаў класа  — да пераменных і метадаў (прыклад 2.2). Аднак калі пры звароце праз звычайную пераменную выкарыстоўваецца сімвал кропка, то для звароту да членаў класа праз паказальнік прымяняецца стрэлка «–>» (знакi «мiнус» і «больш»).


[1] Значок пазначае аперацыю «раскрыццё вобласці бачнасцi».

Прыклад 2.1. Праграма для вырашэння наступнай задачы: «Прачытаць з тэкставага файла даныя пра студэнтаў (прозвішча, горад, год нараджэння, адзнакі ЦТ) і вывесці ў файл у парадку змяншэння сумарнага бала прозвішчы, горад і сумарны бал».

#include <iostream>

#include <fstream>

#include <string>

#include <windows.h>

#include <vector>

#include <algorithm>

 

using namespace std;

 

class Student

{

  private:

  /** палі для захоўвання прозвішча

      і назвы горада **/

    string fam, gorod;

  /// поле - год нараджэння

    int god_r;

    vector <int> otm = vector<int>(3);

  public:

  /// метад для сумы адзнак

    int summ();

  /// сетэры для задання значэння палёў

    void set_fam(string f);

    void set_gorod(string g);

    void set_god_r(int r);

    void set_otm(vector <int> d);

  /** гетэр для атрымання радка

     Прозвішча Горад Сума балаў **/

    string get_fam_gor_summ();

};

 

int Student::summ()

{

span lang="EN-US" style="font-size: 10.0pt; font-family: 'Courier New'; color: black; mso-ansi-language: EN-US;">   int s = 0;

   for (auto i:otm)

     s += i;

   return s;

}

 

void Student::set_fam(string f)

{

    fam = f;

}

 

void Student::set_gorod(string g)

{

    gorod = g;

}

 

void Student::set_god_r(int r)

{

    god_r = r;

}

 

void Student::set_otm(vector <int> d)

{

    otm = d;

}

 

string Student::get_fam_gor_summ()

{

   string s;

   s = fam + '\t';

   s += gorod + '\t';

   s += to_string(summ());

   return s;

}

 

void vvod (vector <Student> &d)

{

  ifstream fin ("input.txt");

  int r;

  fin >> r;

  fin.ignore();

  d.resize(r);

  /** Счытванне даных з файла і

      вызначэнне аб'ектаў з

      выкарыстаннем сетэраў **/

  for (int i = 0; i < r; i++){

    string t_str;

    fin >> t_str;

    d[i].set_fam(t_str);

    fin >> t_str;

    d[i].set_gorod(t_str);

    int t_int;

    fin >> t_int;

    d[i].set_god_r(t_int);

    vector<int> t_vect(3);

    fin >> t_vect[0] >> t_vect[1]

        >> t_vect[2];

    d[i].set_otm(t_vect);

  }

}

 

bool comp(Student x, Student y)

{

  return (x.summ() > y.summ());

}

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  vector <Student> a;

  vvod (a);

  ofstream fout ("output.txt");

  sort(a.begin(),a.end(),comp);

  /** вывядзенне даных у файл з

      выкарыстаннем гетэра **/

  for (int i = 0; i < a.size(); i++){

    fout << a[i].get_fam_gor_summ() << endl;

  }

  return 0;

}

Прыклад 2.2. Зварот праз паказальнік да членаў класа Date (прыклад 22.5 навучальнага дапаможніка 10-га класа, $@BOOKVIEWBYIDCH*3574*10521@$#pr5).

Date d4("14.01.2021");

  Date *d5 = &d4;

  d5 -> set_den(17);

  d5 -> set_mesjac(3);

  cout << d4.get_Date_dm() << endl;

Змены па паказальніку d5 у дадзеным выпадку прывядуць да зменаў аб'екта d4. У выніку выканання каманд будзе выведзена 17.3.