C++ programavimo kalba. Konstruktorius, destruktorius, klasių metodų modifikatoriai, objektų masyvai (4 paskaita)

Similar documents
C programavimo kalba. 5 paskaita (Funkcijos, masyvai)

Struktūrų sintaksė Struktūra tai vienodo arba skirtingo tipo kintamųjų rinkinys. Sintaksė: struct vardas { ; type1 var1; type2 var2;... typen varn; //

JAVA pagrindai Lek. Liudas Drejeris

C++ programavimo kalba

C++ programavimo kalba

C programavimo kalba. 3 paskaita (Sąlygos ir ciklo operatoriai, funkcija scanf() )

C++ programavimo kalba

Polimorfizmas. Lekt. dr. Pijus Kasparaitis m. m. pavasario semestras.

C++ programavimo kalba

Kas yra masyvas? Skaičių masyvo A reikšmės: Elementų indeksai (numeriai): Užrašymas Turbo Paskaliu: A[1] A[2] A[3] A[4] A[5]

ĮVADAS JVM Java Virtual Machine Java virtualios mašinos (JVM) JVM write once, run everywhere

C++ programavimo kalba

Parengė ITMM Artūras Šakalys 1

Projektas. .h failai Header failai (interface) .m failai Pačios programos failai ( .xib /.storyboard Vartotojo sąsajos failai

Kodėl programą sudaro daug failų? Sukurtos tipinės funkcijų galėtų būti panaudojamos dar kartą; Sudaroma aiškesnė programos struktūra; Sudaroma galimy

Come to the TypeScript

Paveikslėliai. Lekt. dr. Pijus Kasparaitis m. m. pavasario semestras.

Gijos. Gijų modelis Javoje. R.Vaicekauskas, OP, 2017

Vilniaus universitetas Fizikos fakultetas Radiofizikos katedra R. Grigalaitis Programavimas (Programavimo C++ kalba paskaitų konspektas)

Masyvai Javoje. Masyvai. Objektų talpyklos. Masyvo tipas. Deklaravimo pavyzdžiai. Deklaracija ir sukūrimas. Masyvo superklas - Object

El. pašto konfigūravimas

Buferio perpildymo klaida Įvadas, techniniai klausimai

PHP PROGRAMOS EIGOS VYKDYMO VALDYMAS

C programos struktūra ir funkcijos

C++ programavimo kalba

Web technologijos. Hostingas JavaScript PHP

K R I S T I N A L A P I N. I dalis. Matematikos ir statistikos studijų krypčių pirmo kurso studentams

Apletai (įskiepiai) Lekt. dr. Pijus Kasparaitis m. m. pavasario semestras.

C++ programavimo kalba

2017 m. pagrindinės sesijos informacinių technologijų valstybinio brandos egzamino programavimo užduoties galimi sprendimai

6-7-8 PASKAITOS. Bendros žinios

16. ŠABLONAI. int abs( int ); float fabs( float ); double dabs( double ),...

Redis Ma as, greitas, galingas. Specialiai VilniusPHP

2-3 PASKAITOS. Paprasčiausia programa:

1. AJAX įvadas. AJAX principai:

Uždavinių sprendimas MATLAB aplinkoje

Paskirstytos atminties lygiagretusis programavimas Įvadas į MPI

Trumpai-ilga istorija

A Lithuanian Verbalization Template for ORM conceptual models and rules

DUOMENŲ STRUKTŪROS IR ALGORITMAI. Rūšiavimo algoritmai (įterpimo, burbulo, išrinkimo)

Programavimas C kalba

WWW aplikacijų saugumas 2

Interneto technologijų taikymai

A.Kynienė. С, C++ kalbų ABC. Metodinė priemonė

Paprastų lentelių kūrimas

PHP Lietuviškai. Turinys

KOMPIUTERIŲ TINKLAI. 5 paskaita Tinklo lygmuo, IP protokolas

Išplė&mas. Esamo funkcionalumo papildymas naujomis galimybėmis

Objektiškai Orientuotas Programavimas su C++

double *pdouble1, *pdouble2, *pdouble3, double4;

COSC 320 Exam 2 Key Spring Part 1: Hash Functions

KLIENTŲ DUOMENŲ BAZĖS IR SANTYKIO SU KLIENTAIS VALDYMO PROGRAMA

KRISTINA LAPIN PROGRAMAVIMAS PASKALIU IR C. II dalis MATEMATIKOS IR STATISTIKOS STUDIJŲ KRYPČIŲ PIRMO KURSO STUDENTAMS

KAUNO TECHNOLOGIJOS UNIVERSITETAS

Java kalbos naujovės (nenagrinėtos paskaitose: versijos) R.Vaicekauskas. mif.vu

DTD aprašas gali būti XML failo viduje. Šiuo atveju jis įterpiamas į žymę DOCTYPE naudojant tokią sintaksę:

T u r b o P a s k a l i s 7.0

Objektinis programavimas su C++ naudojant Qt 4

Informacijos apsaugos standartai serija

Pažintis su C++ Builder

C++ Memory Map. A pointer is a variable that holds a memory address, usually the location of another variable in memory.

Introduction Of Classes ( OOPS )

Trigeris, realizuojantis dalykin taisykl darbuotojas negali dalyvauti daugiau nei 3 projektuose : trigerio kamienas - vienas ar keli SQL sakiniai,

Elektroninis.lt šakninių sertifikatų diegimas

Pasirenkamojo modulio kūrybinio darbo atlikimas ir vertinimas

II SEKCIJA. Duomenų bazės ir modeliai

Sequential Nonlinear Mapping versus Simultaneous One

CSCI 101L - Data Structures. Practice problems for Final Exam. Instructor: Prof Tejada

Atminties technologijos

4 SKYRIUS. Programuojamieji loginiai valdikliai. Įvadas

Programming in C++: Assignment Week 5

Collections (Java) Collections Framework

Web servisai WSDL. Osvaldas Grigas

1- Write a single C++ statement that: A. Calculates the sum of the two integrates 11 and 12 and outputs the sum to the consol.

Inheritance, and Polymorphism.

Duomenų vietisumo užtikrinimas

Principles of Computer Architecture Processors Lecture 1

Linked List using a Sentinel

Scott Gibson. Pointers & Dynamic Memory. Pre & Co Requisites. Random Access Memory. Data Types. Atomic Type Sizes

Homework 6. Yuji Shimojo CMSC 330. Instructor: Prof. Reginald Y. Haseltine

2 nd Week Lecture Notes

I. FFDATA STRUKTŪROS APRAŠYMAS

Polymorphism Part 1 1

C# IR JAVA PROGRAMAVIMO KALBŲ LYGINAMOJI ANALIZĖ

ELEKTRONINIŲ PROJEKTŲ RENGIMO IR VALDYMO SISTEMA

Exercise1. // classes first example. #include <iostream> using namespace std; class Rectangle. int width, height; public: void set_values (int,int);

UNOFFICIAL TRANSLATION

Interaktyviame režime: visi 5 etapai vykdomi nuosekliai; DBVS SQL sakinius interpretuoja. Programose: dalis etap gali bti atlikti kompiliuojant.

CAAM 420 Fall 2012 Lecture 29. Duncan Eddy

Programming in C++: Assignment Week 8

Modern C++ for Computer Vision and Image Processing. Igor Bogoslavskyi

ISO XML standarto pranešimų naudojimo taisyklės v.2.3

CMPS 221 Sample Final

Amadeus On-Line Helpdesk

Name MULTIPLE CHOICE. Choose the one alternative that best completes the statement or answers the question.

OBJEKTŲ SAVYBIŲ MODELIO GRAFINIS REDAKTORIUS

Programming in C++: Assignment Week 4

1. (25 pts) Short Answer. Provide brief (1-3 sentence) answers to the following:

Circle all of the following which would make sense as the function prototype.

CSc Introduc/on to Compu/ng. Lecture 8 Edgardo Molina Fall 2011 City College of New York

Transcription:

C++ programavimo kalba Konstruktorius, destruktorius, klasių metodų modifikatoriai, objektų masyvai (4 paskaita)

Konstruktorius Sukuriant objektą, jo duomenims paprastai turi būti priskiriamos pradinės reikšmės. Tai gali atlikti tam skirti metodai. Bet būtų patogu, jei kuriant objektą, duomenų inicializacija būtų atliekama automatiškai, neiškviečiant papildomų metodų. Tai galima atlikti naudojant specialų metodą konstruktorių. Konstruktorius tai metodas, kuris automatiškai vykdomas kiekvieną kartą, kai tik sukuriamas objektas. Konstruktoriaus savybės: Turi tokį pat pavadinimą, kaip ir klasė; Nieko negrąžina t.y. neturi operatoriaus return; Konstruktoriaus paskirtis priskirti pradines reikšmes klasės kintamiesiems. 2

Konstruktorius Klasė #include <iostream> using namespace std; class studentas { private: float svoris; studentas(float x) { svoris = x; void rodo() { cout << svoris << endl; // konstruktorius void main() { studentas Algis(120.25); studentas Jonas(56.2); cout<< Algio svoris ; Algis.rodo(); cout<< Jono svoris ; Jonas.rodo(); 3

Konstruktorius #include <iostream> using namespace std; class Counter {private: unsigned int count; Counter() { count = 0; void increase() { count ++ ; int show() { return count; void main() { Counter C1; cout<< Skaitliukas = << C1.show() << endl; C1.increase(); cout << Skaitliukas = << C1.show()<<endl; 4

Konstruktorius Konstruktoriuje klasės duomenims reikšmės gali būti priskiriamos naudojant įprastinę funkcijų sintaksę arba inicializacinį sąrašą. Naudojant inicializacinį sąrašą, kintamiesiems reikšmės priskiriamos prieš konstruktoriaus vykdymą. const tipo duomenys bei nuorodos gali būti inicializuotos tik inicializaciniame sąraše. Counter() { count = 0; { Counter() : count(0) Konstruktorius kaip funkcija Automatinė inicializacija per sąrašą 5

Inicializacinis sąrašas class circle { private: int radius; int c_x, c_y; circle (int a, int b, int c) : radius(a), c_x(b), c_y(c) { Apibendrinus AnyClass( ) : m1(7), m2(12), m3(23.56) { AnyClass( int x, int y, float z ) : m1(x), m2(y), m3(z) { 6

Konstruktoriaus savybės Konstruktorius negrąžina jokios reikšmės; Nenurodomas konstruktoriaus kaip funkcijos tipas; Konstruktorius nepaveldimas; Konstruktorius negali būti apibrėžtas taikant modifikatorius const, violatile, static, virtual; Jei klasėje neapibrėžtas konstruktorius, kuriant objektą, vykdomas konstruktorius pagal nutylėjimą. 7

Konstruktorių perkrovimas (overloading) Jei klasėje nėra apibrėžtas konstruktorius, kompiliatorius automatiškai kuria konstruktorių be argumentų sąrašo. Toks konstruktorius rezervuoja atmintį objektui, bet duomenims reikšmių nepriskiria. Visgi tikslinga atskirai sukurti konstruktorių be argumentų sąrašo, priskiriant duomenims pradines reikšmes. Jei klasėje yra keli konstruktoriai, sakoma, kad konstruktorius yra perkrautas (overloaded). class atstumas { private: float ilgis; float plotis; atstumas() : ilgis(0.0), plotis(0.0) { atstumas (float x, float y) { ilgis = x; plotis = y; void main() { atstumas a1, a2; atstumas a3(12.4, 45.1); 8

Pavyzdys #include <iostream> using namespace std; class Staciakampis { int ilgis, plotis; Staciakampis (): ilgis(3), plotis(3) { Staciakampis (int, int); int plotas () { return (ilgis*plotis); int main () { Staciakampis rect; Staciakampis rectb (5,6); cout << Plotas: " << rect.plotas() << endl; cout << Plotas: " << rectb.plotas() << endl; return 0; Staciakampis :: Staciakampis (int a, int b) { ilgis = a; plotis = b; 9

Konstruktorius pagal nutylėjimą Jei klasėje nėapibrėžtas nei vienas konstruktorius, tuomet kompiliatorius sukuria konstruktorių pagal nutylėjimą. Toks konstuktorius nepriskiria objekto duomenims jokios reikšmės, nors atmintyje išskiria kintamiesiems vietą. Konstruktorius pagal nutylėjimą naudojamas tik tuomet, kai nėra sukuriamas joks kitas konstruktorius. class Staciakampis { int ilgis, plotis; int plotas (int a, int b) { ilgis = a; plotis = b; return (ilgis*plotis); class Staciakampis { int ilgis, plotis; Staciakampis (): ilgis(2), plotis(3) { int plotas () { return (ilgis*plotis); Staciakampis didelis; 10

Kopijos konstruktorius (default copy constructor) Objektas gali būti inicializuotas naudojant kito to paties tipo objekto kopiją. Tokiu atveju nereikia kurti specialaus konstruktoriaus, jį automatiškai kuria kompiliatorius. Kopijos konstruktorius tai vieno argumento funkcija, kurios argumentas tos pačios klasės objektas. class distance { float ilgis; float plotis; distance (float x, float y) { ilgis = x; plotis = y; void show() { cout<< "Kintamieji ilgis " << ilgis<<endl; cout<< \t plotis " << plotis<<endl; void main () { distance d3(2.5, 5.8); distance d2(d3); // kopijos konstr. distance d1 = d3; // kopijos konstr. d3.show(); d2.show(); d1.show(); 11

Destruktorius Destruktorius tai specialus metodas, kuris iškviečiamas automatiškai tuomet, kai naikinamas objektas. Jo paskirtis naikinti objektą ir atlaisvinti atmintį. Destruktoriaus savybės: pavadinimas ~klasės_pavadinimas nieko negrąžina neturi argumentų sąrašo destruktorius nepaveldimas destruktorius negali būti apibrėžtas naudojant modifikatorius const, violatile, static, virtual Jei destruktorių reikia iškviesti rankomis, naudojama sintaksė: objektas.~klasė(); 12

Destruktorius (pavyzdys) #include <iostream> using namespace std: class Any { private: int a, b; Any(int x, int y) { a = x; b = y; void show_x() { cout << a << endl; cout<< b << endl; ~Any() {cout<< Vykdomas destruktorius \n ; void main() { Any c1(33, 22); c1.show_x(); Ekrane 33 22 Vykdomas destruktorius 13

Destruktorius (pavyzdys) #include <iostream> using namespace std; class Staciakampis { int *ilgis, *plotis; Staciakampis (int, int); ~Staciakampis (); int plotas () { return (ilgis*plotis); Staciakampis :: Staciakampis (int a, int b) { ilgis = new int; plotis = new int; *ilgis = a; *plotis = b; Staciakampis ::~ Staciakampis () { delete width; delete height; int main () { Staciakampis rect (3,3); Staciakampis rectb (5,6); cout << Plotas: " << rect.plotas() << endl; cout << Plotas: " << rectb.plotas() << endl; return 0; 14

Rodyklė this Kiekvienas C++ objektas turi specialią rodyklę, kurios pavadinimas this. Ją automatiškai sukuria kompiliatorius. Rodyklė this rodo į patį objektą. Rodyklės this veikimo sritis klasė, kurioje ji apibrėžta. Faktiškai this yra paslėptas klasės parametras, kurį prideda pats kompiliatorius metodo iškvietimo metu. Metodo iškvietimo pavyzdys: Obj.name(par1, par2); -> Obj.name(&Obj, par1, par2); Obj::name(param1, param2) { cout<< Hello <<param1<<endl; cout<< Hello <<this->param1<<endl; cout << this<< endl; // tas pats,kaip ankst.eilutėje // išvedamas objekto adresas Dažniausiai this naudojamas, kai metodas gražina rodyklę arba nuorodą į objektą pvz: return this; return *this; Tai pritaikoma operatorių perkrovime. 15

Statiniai klasės duomenys Statiniai duomenys klasėse naudojami, kai visi tos pačios klasės objektai turi dalintis bendra informacija. Pavyzdys programoje sukurtų objektų skaičius. Statinių duomenų apibrėžimui naudojamas raktinis žodis static. Toks kintamasis pasiekiamas tik iš klasės, tačiau jis atmintyje saugomas iki programos darbo pabaigos. class pva { private: static int count; pva () { count ++; int getcount () { return count; int pva::count = 0; // tik kai static void main() { pva f1, f2, f3; cout<< f1.getcount()<<endl; // 3 cout<< f2.getcount()<<endl; // 3 cout<< f3.getcount()<<endl; // 3 16

const ir klasės Klasės duomenys negali būti konstantos!!! Tik klasės metodai gali būti apibrėžti su modifikatoriumi const Toks metodas negali modifikuoti klasės kintamųjų reikšmių, todėl const metodai naudojami tik reikšmių išvedimui. Tokių metodų argumentų sąraše dažniausiai būna nuorodos. class aclass { private: int alpha; aclass() : alpha(10) { void nonfunc() { alpha = 100; void consfunc() const { alpha = 200; // klaida, negalima modifikuoti cout <<alpha<<endl; ; 17

const ir objektai Galima apibrėžti ir const objektus. Tuo atveju objekto negalima modifikuoti, tai reiškia kad galima naudoti tik metodus, apibrėžtus, kaip const, nes tik jie garantuoja, kad duomenys nebus modifikuoti. class Distance { private: float ilgis; float plotis; distance (float x, float y) : ilgis(x), plotis(y) { void show() const { cout<< "Kintamieji ilgis " << ilgis<<endl; cout<< \t plotis " << plotis<<endl; void get() {cin>>ilgis>>plotis; void main() {const Distance d(2.3, 4.3); d.get(); // klaida d.show(); 18

Objektų masyvai Objektai kaip ir paprasti kintamieji gali sudaryti masyvus. Sintaksė niekuo nesiskiria nuo įpratinės masyvų apibrėžimo sintaksės. AnyClass ACDC[10]; Kompiliatorius kurdamas masyvą, naudoja konstruktorių pagal nutylėjimą, todėl rekomenduojama klasėje apibrėžti tokį konstrukorių. Masyvų elementai pasiekiami analogiškai, kaip ir įprastinių masyvų. class AnyClass { int a; AnyClass(int x) { a = x; int show() { retunt a; main() { AnyClass Arr[3] = { 12, 14, 16 for (int i = 0; i<3; i++) cout<< Arr[i].show()<< endl; return 0; 19

Objektų masyvai (pavyzdys) #include <iostream> using namespace std; class plotas { private: int x, y, stac_plotas; void calc(int a, int b) { x = a; y = b; stac_plotas = a*b; int getcalc () { return stac_plotas; void main() { plotas f1[5]; // sukuriamas 5 objektų masyvas for (int i = 0; i < 5; i++) { f1[i].calc(i+1, i+3); // priskiriamos reikšmės ir skaičiuojami plotai cout << f1[ i ].getcalc() <<endl; 20

Objektų masyvai (pavyzdys) class AnyClass { int x, y; AnyClass(int a, int b) { x=a, y=b; int Getx() { return x; int Gety() { return y; main () { AnyClass Arr[2][2] = { AnyClass(1,2), AnyClass(2,3), AnyClass(3,4), AnyClass(5,6) int i, j; for (i = 0; i<2; i++) for (j = 0; j<2; j++) { cout<< Arr[i][j].Getx(); Kas bus ekrane? cout<< Arr[i] [j].gety()<< endl; return 0; 21

Objektų masyvai (pavyzdys) class AnyClass { int x, y; AnyClass(int a, int b) { x=a, y=b; AnyClass() { x=0, y=0; int Getx() { return x; int Gety() { return y; main () { AnyClass * ptr; int i ; ptr = new AnyClass[6]; for (i = 0; i < 6; i++) { cout<< ptr->getx()<< endl; cout<< ptr->gety()<< endl; ptr ++; return 0; // konstruktorius pagal nutylėjimą Kas bus ekrane? 22