classes objects c
Короткий вступ до класів та об'єктів на C ++.
Класи та об'єкти - це будівельні блоки об'єктно-орієнтованого програмування на C ++. Кожна сутність, жива або нежива, може бути представлена як об'єкт і запрограмована відповідним чином за допомогою C ++. Таким чином, такі об'єкти, як автомобіль, стіл, людина, птах, тварина тощо, можуть бути представлені як об'єкти.
Клас - це рівень, вищий за об’єкт, і представляє категорію об’єктів. Таким чином, клас діє як план, який окреслює дизайн об'єкта та деталі. Сюди входять дані, що використовуються для опису об’єкта, та різні методи чи функції, які можуть діяти на дані об’єкта.
=> Зверніть увагу на прості навчальні серії C ++ тут.
У цьому посібнику ми обговорюємо всі деталі класу та об'єктів у C ++, а також їх програмне представлення.
Що ви дізнаєтесь:
- Заняття
- Об'єкти
- Специфікатори доступу
- Конструктори
- Види конструкторів
- Оператор присвоєння
- Руйнівники
- “Цей” покажчик
- Висновок
- Рекомендована література
Заняття
Клас на C ++ можна розглядати як проект або скелет певної сутності. Клас - це визначений користувачем тип даних. Він містить загальну інформацію або дані про цю конкретну сутність та функції, що діють на цю сутність.
У синтаксисі С ++ ми визначаємо клас із ключовим словом “клас”, за яким йде назва класу.
За назвою класу слідують деталі класу, укладені фігурними дужками, і закінчуються крапкою з комою.
Наступний блок показує загальний синтаксис для визначення класу.
Як показано у наведеному вище поданні, клас може мати специфікатори доступу, такі як public / protected / private. Він може мати члени даних та функції членів. Дані та функції викликаються як члени класу. За замовчуванням члени є приватними для класу, так що жодна зовнішня сутність не має доступу до цих членів.
Наприклад, транспортний засіб може бути узагальненим класом, що має такі властивості, як модель, колір, номер шасі, середня_швидкість тощо. Він може мати такі функції, як changeModel, прискорення, уповільнення тощо, які виконують дії з членами даних. Ми можемо визначити клас з назвою „транспортний засіб”, який матиме всі ці члени даних та функції.
Як уже зазначалося, клас - це лише проект для сутностей. Він не займає місця в пам'яті, коли він визначений. Щоб клас був функціональним, ми повинні визначити об’єкти, які можуть використовувати членів класу.
Об'єкти
Для того, щоб використовувати функціональність класу, нам потрібно створити екземпляр класу для створення об'єкта. Об'єкт - це екземпляр класу. Простими словами, можна сказати, що об'єкт є змінною класу типу.
Загальний синтаксис створення об’єкта:
classname object_name;
Після створення об’єкта його можна використовувати для доступу до членів даних та функцій цього класу.
Доступ до членів класу (даних та функцій) здійснюється за допомогою оператора dot (.), Який також називається оператором доступу членів.
Якщо obj є ім'ям об'єкта і в класі є функція “display ()”, тоді функція може бути доступна як “obj.display ()”.
Однак у наведеному вище твердженні є фішка. Ми можемо отримати доступ до функції display (), використовуючи об'єкт та оператор крапок, якщо функція є 'загальнодоступною'.
Специфікатори доступу
У C ++ доступ до членів даних та функцій у класі залежить від доступу, наданого конкретному члену даних або функції за допомогою специфікатора доступу.
C ++ підтримує такі специфікатори доступу:
# 1) Приватна
Це специфікатор доступу за замовчуванням для класу на C ++. Це означає, що якщо для членів класу не вказано специфікатор доступу, то він вважається приватним.
Коли учасник є приватним, його неможливо отримати за межами класу. Навіть не використовуючи об’єкт та оператор точки. Доступ до приватних членів даних можна отримати лише за допомогою функцій-членів класу.
Питання та відповіді на інтерв’ю для python
Однак із цього правила є виняток, про який ми поговоримо у наступних темах.
# 2) Громадський
Член даних або функція, визначена як загальнодоступна в класі, доступна кожному, хто не входить до класу. До цих членів можна отримати доступ за допомогою об'єкта та оператора крапок.
# 3) Захищений
Захищений член класу доступний для самого класу та дочірніх класів цього класу.
Цей специфікатор доступу особливо використовується у випадку успадкування, і ми детально обговоримо це під час обговорення теми успадкування.
Візьмемо наступний приклад, щоб краще зрозуміти ці специфікатори доступу.
#include #include using namespace std; class ABC{ int var1 = 10; public: string name; void display() { cout<<'var1 ='< Вихід:
var1 = 10
name = sth
У цій програмі у нас є два члени даних, з яких var1 типу int є приватним (специфікатор доступу не вказаний. За замовчуванням приватний). Іншим членом є ім'я рядка, яке оголошено як загальнодоступне. У нас є ще одна функція відображення, яка відображає значення обох цих членів.
У головній функції ми оголошуємо об'єкт abc класу ABC. Потім ми встановлюємо значення для членів даних, а також відображення функції виклику за допомогою об’єкта «abc».
Однак, коли компілятор зустрічає рядок abc.var1 = 20; це призведе до помилки, що “var1 є приватною змінною”.
Це тому, що ми не можемо отримати доступ до приватних даних членів класу поза класом. Таким чином є помилка. Але ми можемо отримати доступ до нього всередині функції, і тому, коли ми виводимо значення var1 у функцію відображення; це не викликає жодної помилки.
Отже, на виході програми відображається початкове значення, з яким оголошено var1.
До цього часу ми бачили деталі щодо класів, об’єктів та специфікаторів доступу, тепер давайте розглянемо повний приклад зразка студента класу. У цьому класі є учасники даних: student_id, student_name та student_age. Він також має функції членів для читання інформації про студента та відображення інформації про студента.
Щоб полегшити роботу читачам, ми оголосили всіх учасників класу загальнодоступними.
Наступна програма показує повну реалізацію.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; void read_studentInfo(); void print_studentInfo() { cout<<'
Student ID : '<student_id; cout<>student_name; cout<>student_age; } int main() { student s1; s1.read_studentInfo(); s1.print_studentInfo(); }
Вихід:
Введіть ідентифікатор студента: 1
Введіть ім'я студента: abc
Введіть student_age: 12
Ідентифікаційний номер студента: 1
Ім'я студента: abc
Студентський вік: 12
Таким чином, ми маємо повний клас, визначений вище. Єдина помітна відмінність полягає в тому, що ми визначили одну функцію “print_studentInfo” всередині класу, тоді як іншу функцію “read_studentinfo” визначено поза класом. Це два способи визначення функцій-членів для класу.
Зверніть увагу, що функція, визначена зовні, все ще має декларацію / прототип усередині класу. Крім того, він визначається поза класом за допомогою оператор роздільної здатності (: :) . Потім в основній функції ми створюємо об’єкт класу студента, а потім викликаємо функції для зчитування та відображення даних.
Конструктори
Наразі в цьому посібнику ми створили простий об’єкт, а потім призначаємо значення кожному члену класу в основній функції після зчитування цих значень зі стандартного вводу.
У цій темі ми розглянемо спеціальну функцію, яка використовується для ініціалізації об’єкта під час його створення. Ця спеціальна функція називається конструктором.
Конструктор - це функція-член класу, але вона відрізняється від звичайної функції-члена наступними способами:
- Конструктор не має поверненого значення, тобто конструктор ніколи не повертає значення.
- Це загальнодоступна функція члена класу.
- Він використовується для ініціалізації членів даних та побудови об'єкта класу.
- Він автоматично викликається компілятором під час створення об’єкта.
Види конструкторів
С ++ підтримує такі типи конструкторів.
# 1) Конструктор за замовчуванням
Конструктор за замовчуванням є основним конструктором і не має параметрів. Ми можемо створити простий об’єкт без будь-яких параметрів, використовуючи конструктор за замовчуванням.
Конструктор за замовчуванням має такий синтаксис:
classname() { //constructor code }
Якщо у класі немає конструктора за замовчуванням, тоді компілятор створює його.
# 2) Параметризований конструктор
Параметризований конструктор - це той, який має список параметрів, за допомогою якого ми можемо ініціалізувати члени класу. Коли ми оголошуємо об'єкт у параметризованому конструкторі, нам потрібно передати початкові значення функції конструктора як параметри.
Параметризована функція конструктора виглядає, як показано нижче.
classname(argument list){ //constructor code }
Параметризований конструктор використовується для перевантаження конструкторів. Докладніше про перевантаження ми побачимо у наступних темах.
Параметризований конструктор використовується з метою ініціалізації членів даних різних об'єктів. Роблячи це, ми можемо передавати різні значення членів даних різним об'єктам.
# 3) Конструктори копіювання
С ++ підтримує третій тип конструктора, відомий як конструктор копіювання. Його загальний вигляд є
ім'я класу (const classname & obj);
Як показано у наведеній вище декларації, у конструкторі копій створюється новий об'єкт із використанням значень іншого об'єкта того ж класу. Параметр, який передається конструктору, є постійним посиланням на об'єкт, значення якого будуть використані для побудови нового об'єкта.
Конструктор копіювання зазвичай викликається в таких ситуаціях:
- Коли об'єкт класу повертається за значенням.
- Коли об’єкт передається функції як аргумент і передається за значенням.
- Коли об'єкт будується з іншого об'єкта того ж класу.
- Коли тимчасовий об'єкт генерується компілятором.
Однак ми не можемо гарантувати, що конструктор копіювання обов'язково буде викликаний у всіх вищезазначених випадках, оскільки компілятор C ++ має спосіб оптимізувати операції копіювання.
Конструктор копіювання здійснює членське копіювання між об'єктами. Так само, як конструктор за замовчуванням, компілятор C ++ створює конструктор копій за замовчуванням, якщо ми не надаємо такого в нашій програмі. Але коли у класі є певні члени даних, такі як вказівники, посилання чи будь-яке розподіл ресурсів під час виконання, тоді нам потрібно мати власний конструктор копіювання, який визначається користувачем.
Причина полягає в тому, що конструктор копій за замовчуванням виконує лише неглибоку копію членів даних, тобто обидва об'єкти матимуть спільне розташування пам'яті. Це чудово для простих невказівних членів даних.
Однак, коли справа стосується покажчиків або будь-яких інших динамічних членів даних, ми б хотіли, щоб дані були спрямовані на нове місце в пам'яті. Це глибока копія, і її можна досягти лише за допомогою визначеного користувачем конструктора копіювання.
як відтворювати файли .jar - -
Нижче наведена повна програма C ++, яка реалізує всі три типи конструкторів та їх використання при побудові об'єкта.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; //default constructor student(){ student_id = 1; student_name = 'abc'; student_age = 10; } //parameterized constructor student(int id,string name,int age){ student_id = id; student_name = name; student_age = age; } //copy constructor student(const student& st){ student_id = st.student_id; student_name = st.student_name; student_age = st.student_age; } void print_studentInfo() { cout<<'
Student ID : '< Вихід:
********** s **********
Ідентифікаційний номер студента: 1
Ім'я студента: abc
Студентський вік: 10
********** s2 **********
Ідентифікаційний номер студента: 2
Ім'я учня: xyz
Студентський вік: 12
Знімок екрана для цього наведено нижче.

У цій програмі ми визначили студента класу, подібного до викладеного в попередній програмі. Різниця полягає в тому, що замість зчитування значень елементів даних із стандартного введення через функцію ми визначаємо три конструктори.
Абсолютно можливо для класу мати більше одного конструктора. У нас є конструктор за замовчуванням, який ініціалізує члени даних до початкових значень. Далі ми визначаємо параметризований конструктор, який передає початкові значення як параметри конструктору.
Далі ми визначаємо конструктор копіювання, якому передаємо постійне посилання на об’єкт класу студента.
У головній функції ми створюємо три об’єкти окремо, використовуючи три конструктори. Перший об'єкт s створюється за допомогою конструктора за замовчуванням. Другий об'єкт s1 створюється за допомогою параметризованого конструктора, тоді як третій об'єкт s2 створюється за допомогою конструктора копіювання.
Зверніть увагу на створення третього об’єкта s2. Тут ми присвоюємо вже створений об'єкт s1 новому об'єкту s2. Таким чином, коли ми створюємо новий об’єкт, використовуючи вже існуючий об’єкт, компілятор викликає конструктор копіювання.
Оператор присвоєння
Ми також можемо призначити значення одного об'єкта іншому, використовуючи оператор присвоєння (=). У цьому випадку ми матимемо твердження типу s1 = s.
Різниця між конструктором копіювання та оператором присвоєння полягає в тому, що, хоча конструктор копіювання будує взагалі новий об'єкт, оператор присвоєння просто присвоює значення члена об'єкта на RHS значенням об'єкта на LHS. Це означає, що об'єкти по обидва боки оператора присвоєння повинні існувати до призначення.
Руйнівники
Деструктор - це також спеціальна функція, подібно конструктору, але він реалізує функціональність, яка є абсолютно протилежною конструктору. Поки конструктор використовується для створення об'єкта, деструктор використовується для знищення або видалення об'єкта.
Деякі характеристики деструктора включають:
- Ім'я деструктора те саме, що і ім'я класу, але починається зі знака тильди (~).
- Деструктор не має типу повернення.
- Деструктор не має аргументів.
- У класі може бути лише один деструктор.
- Компілятор завжди створює деструктор за замовчуванням, якщо нам не вдається надати його для класу.
Загальний синтаксис деструктора:
~classname(){ //cleanup code }
Деструктор класу зазвичай викликається в таких ситуаціях:
- Коли об'єкт виходить за межі області дії, тоді автоматично викликається деструктор класу.
- Подібним чином деструктор викликається, коли програма закінчує виконання. Це означає, що всі об’єкти також перестають існувати. Отже, буде викликаний деструктор кожного об'єкта.
- Деструктор класу також викликається, коли виконується оператор ‘delete’ для видалення об’єкта.
- Ми також можемо прямо викликати деструктор для виконання будь-яких дій з очищення після того, як ми закінчимо функціонувати об’єкт.
Наведений нижче приклад демонструє роботу деструктора.
#include using namespace std; class sample{ public: sample(){ cout<<'Constructor::sample called'< Вихід:
Викликано конструктор :: зразок
Це зразок класу
Destructor :: ~ виклик зразка
Знімок екрана для наведеного вище результату наведено нижче.

Ми визначили зразок класу, в якому визначили конструктор, деструктор та відображення функції. У основній функції ми створюємо об'єкт obj класу sample, а потім викликаємо функцію display на цьому об'єкті.
Після цього виконується повернення 0. На виході ми бачимо, що в той момент, коли функція відображення повертається, а елемент керування програмою приходить до оператора return 0, деструктор виконується. Це означає, що він виконується в той момент, коли об'єкт виходить за межі області дії.
“Цей” покажчик
С ++ використовує спеціальну концепцію, пов'язану з об'єктами, яка відома як 'цей' покажчик. Покажчик “this” завжди вказує на поточний об’єкт. Таким чином, залежно від ситуації, коли нам доводиться посилатися на поточний об’єкт, ми використовуємо покажчик “this”.
Ми знаємо, що кожного разу, коли створюється екземпляр класу, тобто об’єкт, для об’єкта робиться окрема копія даних членів класу. Але коли справа стосується функцій-членів класу, усі об’єкти мають однакову копію.
Отже, коли один або декілька об’єктів одночасно отримують доступ до функцій-членів, як ми можемо забезпечити доступ та зміну належних членів даних за допомогою функцій-членів?
Це місце, де вказує „цей” вказівник. Компілятор передає неявний покажчик з ім'ям функції як 'це'. Це називається покажчиком “this”.
Покажчик “this” передається як прихований аргумент для всіх викликів функції-члена. Зазвичай це локальна змінна. Отже, покажчик “this” є постійним покажчиком, а його вміст є адресою пам'яті поточного об’єкта.
Зверніть увагу, що цей покажчик доступний лише для нестатичних функцій-членів, а не для статичних функцій. Це пов’язано з тим, що статичні функції не потрібно отримувати за допомогою об’єкта. До них можна безпосередньо отримати доступ, використовуючи назву класу.
Зазвичай ми використовуємо покажчик “this” у ситуаціях, коли змінні-члени та параметри передаються для ініціалізації змінних-членів, що мають одне і те ж ім’я. Ми також використовуємо його, коли нам потрібно повернути поточний об'єкт із функції.
Побачимо демонстрацію вказівника “цей” нижче.
#include using namespace std; class Sample { private: int num; char ch; public: Sample &setParam(int num, char ch){ this->num =num; this->ch = ch; return *this; } void printValues(){ cout<<'num = '< Вихід:
число = 100
ch = A
У наведеній вище програмі ми маємо клас, який називається Sample, з двома членами даних num та ch. У нас є функція-член setParam, яка передає параметри з однаковими іменами, num та ch, щоб встановити значення змінних-членів.
найкраще програмне забезпечення для клонування для Windows 10
Усередині функції ми присвоюємо ці значення поточним змінним-членам об'єкта, позначеним цим покажчиком. Після встановлення значень поточний об'єкт 'this' повертається із функції.
У основній функції ми спочатку створюємо об’єкт класу Sample, obj і викликаємо функцію setParam для встановлення значень, а потім викликаємо функцію printValues для друку значень.
Висновок
У цьому посібнику ми вивчили основні будівельні блоки ООП на C ++. Розуміння класів та об’єктів є основними вимогами, для початку, ООП в C ++. Ми також детально дізналися про конструктори та деструктори на прикладах.
У нашому майбутньому підручнику ми дізнаємося про списки ініціалізаторів на C ++.
=> Зверніть увагу на прості навчальні серії C ++ тут.
Рекомендована література
- Концепції ООП Python (класи, об'єкти та спадкування Python)
- Інтерфейс Java та підручник з абстрактних класів із прикладами
- Робота з об’єктами Excel VBScript
- Підручник QTP №7 - Парадигма ідентифікації об’єктів QTP - Як QTP унікально ідентифікує об’єкти?
- Сховище об’єктів у QTP - Підручник №22
- Робота з об'єктами підключення ADBB VBScript
- Поліморфізм виконання в C ++
- Спадкування в C ++