classes objects c
Кратко въведение в класовете и обектите на C ++.
Класовете и обектите са градивните елементи на обектно-ориентираното програмиране в C ++. Всеки обект, жив или нежив, може да бъде представен като обект и съответно програмиран с помощта на C ++. По този начин обекти като кола, бюро, човек, птица, животно и др. Могат да бъдат представени като обекти.
Класът е ниво, по-високо от обекта и представлява категорията на обектите. По този начин класът действа като план, който очертава обектния дизайн и детайлите. Това включва данни, които се използват за описване на обекта и различни методи или функции, които могат да действат върху данните на обекта.
=> Внимавайте тук за простият сериал за обучение на C ++.
В този урок ние обсъждаме всички подробности за класа и обектите в C ++ заедно с тяхното програмно представяне.
Какво ще научите:
- Класове
- Обекти
- Спецификатори за достъп
- Конструктори
- Видове конструктори
- Оператор за възлагане
- Разрушители
- “Този” указател
- Заключение
- Препоръчително четене
Класове
Клас в C ++ може да се разглежда като план или скелет на определена същност. Класът е дефиниран от потребителя тип данни. Той съдържа общата информация или данни за конкретния обект и функциите, които работят върху този обект.
В синтаксиса на C ++ дефинираме клас с ключова дума “class”, последвана от името на класа.
Името на класа е последвано от подробностите за класа, затворени в къдри скоби и се прекратява с точка и запетая.
Следващият блок показва общия синтаксис за дефиницията на класа.
Както е показано в горното представяне, класът може да има спецификатори на достъп като публичен / защитен / частен. Той може да има членове на данни и функции на членове. Данните и функциите се извикват като членове на класа. По подразбиране членовете са частни за класа, така че никой външен обект няма достъп до тези членове.
Например, превозно средство може да бъде обобщен клас, притежаващ свойства като модел, цвят, номер на шасито, средна_ скорост и др. Може да има функции като changeModel, ускорение, забавяне и др., които извършват действия върху членовете на данните. Можем да дефинираме клас с име „превозно средство“, който ще има всички тези членове на данни и функции.
Както вече споменахме, клас е просто план за обектите. Не заема място в паметта, когато е дефинирано. За да бъде клас функционален, трябва да дефинираме обекти, които могат да използват членовете на класа.
Обекти
За да използваме функционалността на класа, трябва да създадем екземпляр на класа, за да създадем обект. Обектът е екземпляр на клас. С прости думи, можем да кажем, че обектът е променлива от тип клас.
Общият синтаксис за създаване на обект е:
classname object_name;
След като обектът е създаден, той може да се използва за достъп до членовете на данните и функциите на този клас.
Достъпът до членовете на класа (данни и функции) се извършва с помощта на оператора точка (.), Който също се нарича оператор за достъп на членове.
Ако obj е името на обекта и в класа има функция “display ()”, тогава функцията може да бъде достъпна като “obj.display ()”.
В горното твърдение обаче има уловка. Можем да осъществим достъп до функцията display (), използвайки обект и точков оператор, ако функцията е „публична“.
Спецификатори за достъп
В C ++ достъпът до членовете на данните и функциите в класа зависи от достъпа, предоставен на този конкретен член на данни или функция, използвайки спецификатор за достъп.
C ++ поддържа следните спецификатори за достъп:
# 1) Частно
Това е спецификаторът за достъп по подразбиране за клас в C ++. Това означава, че ако не е посочен спецификатор за достъп за членовете в клас, тогава той се счита за частен.
Когато даден член е частен, той не може да бъде достъпен извън класа. Дори не се използва обектът и точният оператор. Членовете на частните данни могат да бъдат достъпни само с помощта на членовите функции на класа.
искам да тествам продукти за компании
Има обаче изключение от това правило, което ще обсъдим в следващите ни теми.
# 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 е private (спецификаторът за достъп не е посочен. По подразбиране е private). Друг член е името на низа, което е декларирано като публично. Имаме още един функционален дисплей, който показва стойността на тези два члена.
В основната функция декларираме обект 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“ е дефинирана извън класа. Това са двата начина, по които членовите функции могат да бъдат дефинирани за клас.
Имайте предвид, че функцията, която е дефинирана отвън, все още има декларация / прототип вътре в класа. Също така, той се дефинира извън класа с помощта на оператор за разделителна способност (: :) . След това в основната функция създаваме обект на студентски клас и след това извикваме функции за четене и показване на данните.
Конструктори
Досега в този урок създадохме прост обект и след това присвояваме стойности на всеки член на данните от класа в основната функция, след като четем тези стойности от стандартния вход.
В тази тема ще разгледаме специална функция, която се използва за инициализиране на обекта по време на създаването му. Тази специална функция се нарича конструктор.
Конструкторът е функция член на класа, но тя се различава от нормалната функция член по следните начини:
- Конструкторът няма върната стойност, т.е.конструкторът никога не връща стойност.
- Това е публична членска функция на класа.
- Използва се за инициализиране на членовете на данните и конструиране на обекта на класа.
- Той автоматично се извиква от компилатора, когато обектът се създава.
Видове конструктори
C ++ поддържа следните видове конструктори.
# 1) Конструктор по подразбиране
Конструктор по подразбиране е основният конструктор и няма параметри. Можем да създадем прост обект без никакви параметри, използвайки конструктора по подразбиране.
Конструкторът по подразбиране има следния синтаксис:
classname() { //constructor code }
Ако клас няма конструктор по подразбиране, тогава компилаторът го създава.
# 2) Параметризиран конструктор
Параметризиран конструктор е този, който има списък с параметри, чрез който можем да инициализираме членовете на класа. Когато декларираме обект в параметризиран конструктор, тогава трябва да предадем първоначалните стойности на функцията конструктор като параметри.
Параметризирана конструкторска функция изглежда както е показано по-долу.
classname(argument list){ //constructor code }
Параметризиран конструктор се използва за претоварване на конструктори. Ще видим повече за претоварването в следващите ни теми.
Параметризиран конструктор се използва с цел инициализиране на членове на данни на различни обекти. Докато правим това, можем да предаваме различни стойности на членовете на данни на различни обекти.
# 3) Конструктори за копиране
C ++ поддържа трети тип конструктор, известен като конструктор на копиране. Общата му форма е
име на класа (const classname & obj);
Както е показано в горната декларация, в конструктора на копия се създава нов обект, като се използват стойностите на друг обект от същия клас. Параметърът, който се предава на конструктора, е постоянната препратка към обект, чиито стойности ще бъдат използвани за изграждането на новия обект.
Конструктор на копиране обикновено се извиква в следните ситуации:
- Когато обект на клас се връща по стойност.
- Когато обект се предава на функция като аргумент и се предава по стойност.
- Когато обект се конструира от друг обект от същия клас.
- Когато се създава временен обект от компилатора.
Не можем обаче да гарантираме, че конструкторът на копия със сигурност ще бъде извикан във всички горепосочени случаи, тъй като компилаторът на C ++ има начин да оптимизира операциите за копиране.
Конструктор на копиране извършва копиране по членове между обекти. Подобно на конструктора по подразбиране, C ++ компилаторът създава конструктор на копиране по подразбиране, ако не го предоставим в нашата програма. Но когато даден клас има определени членове на данни, като указатели, препратки или каквото и да е разпределение на ресурси по време на изпълнение, тогава трябва да имаме собствен дефиниран от потребителя конструктор за копиране.
Причината е, че конструкторът за копиране по подразбиране изпълнява само плитко копие на членовете на данните, т.е.двата обекта ще споделят едно и също място в паметта. Това е добре за обикновени членове с данни без указател.
Въпреки това, когато става въпрос за указатели или други членове на динамични данни, бихме искали данните да бъдат насочени към ново място в паметта. Това е дълбокото копие и може да се постигне само с помощта на дефиниран от потребителя конструктор за копиране.
как да стартирате jar файл в Windows
По-долу е дадена пълна програма на 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 : '< Изход:
********** с **********
Студентска карта: 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 от проба от клас и след това извикваме функцията за показване на този обект.
След това се връща 0. В изхода можем да видим, че в момента, в който функцията за показване се връща и контролата на програмата стигне до оператор return 0, деструкторът се изпълнява. Това означава, че се изпълнява в момента, в който обектът излезе извън обхвата.
“Този” указател
C ++ използва специална концепция, свързана с обектите, която е известна като 'този' указател. Показалецът „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 = '< Изход:
num = 100
ch = A
В горната програма имаме клас, наречен Sample, с два члена на данните num и ch. Имаме функция за член setParam, която предава параметрите със същите имена, num и ch, за да зададе стойностите на променливите-членове.
как да играя mkv файлове -
Във функцията ние присвояваме тези стойности на текущите променливи на член на обекта, посочени от този указател. След като се зададат стойностите, текущият обект “this” се връща от функцията.
В основната функция първо създаваме обект от клас Sample, obj и извикваме функция setParam, за да зададем стойностите и след това извикваме функцията printValues, за да отпечатаме стойностите.
Заключение
В този урок научихме основните градивни елементи на ООП в C ++. Разбирането на класовете и обектите са основните изисквания, за начало, OOP в C ++. Също така научихме подробно за конструкторите и деструкторите с примери.
В нашия предстоящ урок ще научим за списъците с инициализатори в C ++.
=> Внимавайте тук за простият сериал за обучение на C ++.
Препоръчително четене
- Концепции на ООП на Python (класове, обекти и наследяване на Python)
- Урок за интерфейс на Java и абстрактен клас с примери
- Работа с обекти на VBScript Excel
- Урок за QTP № 7 - Парадигма за идентификация на обекти на QTP - Как QTP идентифицира обектите уникално?
- Хранилище на обекти в QTP - Урок # 22
- Работа с VBScript ADODB Connection Objects
- Полиморфизъм по време на изпълнение в C ++
- Наследяване в C ++