Professional Documents
Culture Documents
Objektinio programavimo konspektas
Objektinio programavimo konspektas
Klasė
Klasės – C++ plėtinys C kalboje įvestoms struktūroms. Klasė praplečia struktūros galimybes apimdama ne
tik duomenis – laukus, bet ir klasės duomenims būdingas funkcijas (klasės funkcijos paprastai vadinamos
metodais). Be to, įvestos papildomos galimybės klasėje slėpti (inkapsuliuoti) atskirus klasės elementus –
laukus ar metodus. Tam skirti specialūs reikšminiai žodžiai public, private ir protected, struktūrą Knyga
galima pateikti kaip lygiai tas pat galimybes turinčią klasę taip:
PVZ:
Inicializacinis sąrašas
Konstruktoriaus perkrovimas
Destruktorius
Rodyklė
Statiniai klasės duomenys
Konstantos, const ir klasės
Objektų masyvai
1-Operatorius throw : kontroliuoja skliausteliais apimtą operatorių grupę, ar ten nekilo išimtis.
Kontroliuojamoje grupėje turi būti bent vienas operatorius (tarkim, funkcijos kvietimas);
2-Operatorius catch : if( klaidos sąlyga ) throw klaidos objektas; – taip esant įvykdytai klaidos
sąlygai yra sukuriamas klaidos objektas;
3-Operatorius try : Toliau operatorius catch gali „sugauti“ vos atsiradusį klaidos objektą, nutraukti
tolesnių kontroliuojamos grupės operatorių vykdymą ir klaidingą situaciją apdoroti.
TypeDef- Jis naudojamas kuriant papildomą kito tipo duomenų pavadinimą, tačiau nesukuria naujo tipo,
išskyrus neaiškų masyvo tipo kvalifikuoto typedef atvejį, kai typedef kvalifikatoriai perkeliami į masyvo
elemento tipą.
Atsakymas: FALSE
Kas tai lokalūs kintamieji?
Atsakymas: 1
Jei klase pirma deklaruoja klase antra kaip draugiskai, tai
Atsakymas: klases antra metodai gali tiesiogiai naudotis klases pirma privaciais
duomenimis ir metodais
Kas tai yra funkcija?
Atsakymas: if(......){.....}
Atsakymas: funkcijas
Kas apibrezia programoje-int a b c
void f();
Kiek maziausiai kartu bus vykdomas “do{…} while (…);” tipo ciklas?
Kuris elementas saugo viena savybes reiksme visiems tos pacios klases objektams?
Kokiais budais informacija galima isvesti I ekrana (duomuo yra sveikasis skaicius)?
Kuris is teiginiu yra teisingas, jei klase paveldi kita klase kaip apsaugota (protected)?
Duotas kodo fragmentas. Isrinkite logine israiska (logical_expression), kuri grazintu “tiesa” (TRUE)
Duotas kodo fragmentas: … Kas bus parodyta ekrane, jei funkcijoje main() bus irasyta …
Kuris is teiginiu yra teisingas, jei klase paveldi kita klase kaip viesa (public)?
ATS : 0
(teisingas)
Ka atspausdins programa?
(teisingas)
Duotas masyvas
ATS: Funkcijas
Zinome, kad programos pradzioje yra sukuriamas masyvas, “int masyvas[20];”. Programos eigoje jis
uzpildomas reiksmemis. Toliau nuskaitome masyvo elementus naudojant cikla for:
Kompiliavimas – tai:
a. Virtualus metodas
ATS: NE
Kas teisinga?
Kas teisinga?
+1. Kas yra klase?
ATSAKYMAS-funkcijos galincios prieiti prie klasiu kurioms sios funkcijos yra draugiskos,pasleptu klasiu
metodu ir kintamuju.
+7.Ar teisingas sekantis teiginys: klases srityse esantys duomenys ir metodai privalo buti uzdari.
ATSAKYMAS-neteisingas.klases srityje esantys duomenys ir metodai gali buti kaip uzdari,taip ir atviri.
ATSAKYMAS-gali uzdengti savo duomenu prieiga(vienam variantui); savyje sukaupia informacija apie
konkretu modeliuojama objekta,jame panaudojamus kitnamuosius ir metodus/
ATSAKYMAS- klases metodai gali buti draugiskos funkcijos, ne klases funkcijos-negali(1var)(2var. klases
metodai naudojami per objekto kreipini,draugiskos funkcijos tik gali naudotis vidiniais objekto resursais)
+11.Operatoriu perkrovimas?
+12???.Ar tiesa,kad operacija ObjA=ObjB klaidingajau kompiliacijos stadijoje, jei ObjA ir ObjB yra skirtingu
tipu?
???13.Jei yra neaprasytas paveldejusios klases konstruktorius,tai bus kvieciamas bazines klases
konstruktorius?
ATSAKYMAS-Taip
+15.Polimorfizmas?
+16.Ar tiesa,kad draugiskos funkcijos turi prieiga prie uzdaru klases kintamuju ir jos nera klases nares
funkcijos(metoda)?
ATSAKYMAS-Taip
ATSAKYMAS- kai vienas objektas inicializuojamas,kitu objektu( pasitiklsinti- kai yra kkuriamas laikinas
objektas,grazinant metodo funckijos reiksme)
+22.Ar teisingas teiginys: klase gali tureti daugiau nei viena konstruktoriu su tuo paciu konstruktoriaus
vardu?
ATSAKYMAS- teisingas
+23.Jei bazine ir paveldejusi klases naudoja metodus su tokiais paciais vardais,tai paveldejusios klases
objektas?
ATSAKYMAS-naudos paveldejusios klases metoda jei metodo naudojimas is bazines klases neaprasytas
operatoriumi.
+24.Paveldejimo paskirtis?
Klase A paveldeta klaseje B. Kokia tvarka bus vykdomi siu klasiu konstruktoriai?- Bklases kontstruktorius,
poto konstruktorius A
Kuris is siu teiginiu yra teisingas,jei klase paveldi kita klase kaip apsaugoja?-bazines klases viesi elementai
taps apsaugoti sivestines klaseje
Kuris elementas issaugo viena reiksme visiems tos pacios klases elementams?- STATIC
Draugiska funkcija ir druagiskos klases metodai gli tiesiogiai kreiptis i apsaugotus ir privacius klases
duomenis- TRUE
PAPILDYMAS
1. Visi bazinės klasės laukai paveldimi
NE
2. Kokio operatoriaus negalima perkrauti?
Ats: ::
(Neleidžiama taip pat perkrauti šių operatorių: ::, ?:, ., sizeof.)
4. Typedef yra raktažodis, skirtas priskirti alternatyvius pavadinimus esamiems duomenų formatams
ATS:Tiesa
5. _______ operatorius skiria dinaminę atmintį
Ats: new
6. Koks operatorius tikrina, ar kontroliuojamoje sekcijoje įvyko klaida?
Ats: catch
7. Ka spausdins programa?
#include <iostream>
using namespace std;
class Animal {
private: int legs, tail;
public: void set()(legs = 4; tail=1;)
friend int compute (Animal a){return a.legs+a.tail+10;}
};
int main () {
Animal *a = new Animal; a->set(); cout<<compute(*a)<<endl; return 0;
}
ATS: kompiliavimo klaida
8. Koks operatorius deklaruoja destruktorių?
Ats: ~
9. Koks raktažodis reikalingas deklaruojant šabloną?
Ats: typename
10. _________ taikomas kuriant klasės objektą iš kito objekto
Ats: kopijos konstruktorius
11. Funkcija, kurios prototipas yra void get (item*i); gauna
Ats: rodykle i objekta
#include <iostream>
using namespace std;
int main() {
int *a = new int[5];
for (int i=1; i<=5; i++) *a++ = i*10;
cout<<*(--a)<<endl;
return 0; }
ATS: 50
19. Kaip deklaruoti postinkremento perkrovimą?
Ats: operator++(int)
20. Kuris tipų pertvarkymas reikalauja RTTI mechanizmo?
Ats: dymanic_cast
21. Bazinės klases paveldi:
10. Kaip išvestinėje klasėje perrašius metodą iškviesti to paties vardo bazinės
klasės metodą?
class SafeStack: public Stack {
public:
int pop( ){
if( top < 0 ){
cout<<"Stack empty"<<endl;
system( "pause" );
exit( 1 );
}
return Stack::pop( ); // pastaba
}
};
1 Paskaita:
Burbulo algoritmas - imame pirmąjį masyvo elementą ir jį lyginame iš eilės su visais likusiais masyvo
elementais. Jei elementų eilė netinkama – sukeičiame juos vietomis. Imame antrąjį elementą, ir visus
veiksmus kartojame – taip iki kol pasieksime priešpaskutinį masyvo elementą.
2 Paskaita: Klases
4 paskaita: Rodykles
Rodykle - kintamasis, saugantis kito konkretaus tipo kintamojo adresą.
Rodyklės taikomos:
Netiesioginei prieičiai prie kintamojo.
Prieičiai prie masyvo elementų.
Argumentams perduoti į funkcijas.
Duomenų grąžinimui iš funkcijos.
Funkcijoms kviesti rodykle.
Dinaminei atminčiai skirti.
Duomenų struktūroms (pavyzdžiui, saitiniam sąrašui) kurti.
Rodykles būtinos dinaminei atminčiai skirti, sąrašams kurti ir kai kurioms virtualių funkcijų galimybėms
realizuoti.
Kuriuose baituose kintamasis bus saugomas, priklauso nuo sisteminės atminties apimties, pačios
programos apimties, programos duomenų apimties, nuo to, kelios programos šiuo metu yra vykdomos ir
pan. – kiekvienąkart paleidus programą, kintamojo adresas bus skirtingas.
Neinicializavus rodyklės, ji rodo atsitiktinį adresą. Galima rodyklę inicializuoti nuline reikšme literalu NULL
arba nullptr.
Nuorodos esminis skirtumas nuo rodyklės: nuoroda yra tik alternatyvus kito kintamojo vardas.
Įreikšminimo operacija - zinant kintamojo adresą, galima gauti ir jo reikšmę arba jam priskirti norimą
reikšmę. Tam taikoma konstrukcija *rodyklė.
Sizeof – isvedamas kokio dydzio yra tas kintamasis. Parodo bet kokio masyvo elementų kieki. Juo taip pat
galima suzinot ir klases objekto lauku uzimamos atminties sritis dydi baitais.
Stack - statinė atmintis programos objektams, ar tai būtų paprastas kintamasis, ar masyvas, ar klasės
objektas, skiriama kompiuterio atmintinės dalyje. Standartiškai jai teskiriama 1 MB atminties.
Heap - tai yra programos vykdymo metu likusi laisva operatyviosios atminties dalis.
New – skiriama dinamines atminties objektui, kuri grazina atminties srities objektai pirmojo baito adresa,
todel ta adresa galima priskirti tik rodyklei.
Delete – siuo operatoriumi yra islaisvinama atmintis, kuri objektui tampa nebereikalinga. Pamirse tai
padaryti gausime atminties nutekejima (memory leak) – pritruks vietos laisvojoje atmintyje.
this-> - tai pointeris i objekta, kuriame mes esame.
8. Lokalaus funkcijos kintamojo adreso negalima grazinti, nes po išėjimo jis yra iskarto sunaikinamas.
9. Kopijos konstruktoriu butina parašyti tada, kai yra klases viduj saugomi pointeriai, kurie rodo I
dinamiskai isskirta atminti. Kai klases viduj yra iskiriama dinamine atmintis ir saugomas pointeris
rodantis I ta dinamine atminti.
10. Operacija -> yra naudojama tada kai norima pagal pointeri pasiekti objekto metoda ar atributa,
lauka.
Kontroliniai klausimai:
1. Operatoriu perkorvimas taikomas bet kokiems veiksmams.
2. Operatoriu perkrovimo prasmė – vietoj metodo vardo naudojamas operatoriaus zenkliukas.
Suprastinti ir padaryti intuityviai labiau suprantama programa.
3. Operatoriu perkorvimas zymimas raktazodziu operator.
4. Skirtumas tarp globalaus ir lokalaus operatoriaus perkrovimo. Lokalus – priristas prie objekto.
Veikia tik taip-> (objektas + int). Globalus – uzrasomas globaliai su papildomais veiksmais. Veikia ir
taip-> (int + objektas).
5. Operatorai kurie negali buti perkraunami: taskas, ?:, ::, sizeof, typeid ir neegzistuojantys
operatoriai (Pvz.: &^$&^%&).
6. Kaip formaliųjų argumentų sąraše skiriamos priešinkremento ir poinkremento operacijos?
Priešinkremento – (int operator++ ()). Poinkremento – (int operator++ (int))
7. Is kaires esantis binarines operacijos objektas laikomas darbiniu. Argumento objektu laikomas
objektas iš perkrautosios operacijos dešiniosios pusės.
8. Sudetingo binarinio operatoriaus veiksmai atliekami is kaires I desine.
9. Duomenu pertvarkymas yra naudojamas skirtingu tipu duomenims sujungti viename prieskyros
operatoriuje ar aritmetiniame reiskinyje.
10. Duomenu pervardijimas (įskaitant ir klases) atliekamas raktazodziu typedef.
11. Duomenu pervardijimas pravartu naudoti, kai kintamieji turi ilgus pavadinimas. (Pvz.: typedef
unsigned long long ull).
Paveldimumas:
Protected – naudojamas tam, kad išvestinės klasės metodams būtų prieinami bazinės klasės laukai. Tačiau
jei programoje būtų paveldimumu nesusietų klasių, protected laukai gretimų klasių metodams liktų
neprieinami. Jei laukai būtų griežtai užverti – private – jie būtų prieinami tik pačios bazinės klasės viduje.
Public reiškia, kad realizuojamas bendrasis paveldimumas.
Kai programa sudėtinga, patogu pateikti jos klasių struktūrą ir paveldimumo schemą vadinamąja UML
diagrama. UML diagramoje parodomi klasių pavadinimai, atskiruose laukeliuose išvardijami laukai,
konstruktoriai, destruktoriai ir metodai bei klasių laukų prieigos galimybės. private laukai yra žymimi
simboliu „–“, protected - „#“, public – „+“. Paveldimumas žymimas rodykle bazinės klasės link. Išvestinės
klasės laukeliuose užrašomas tik klasės pavadinimas ir visi papildomi laukai, konstruktoriai, destruktoriai ir
metodai. Jei papildomų savybių laukų ar metodų skyriuose nėra, šie skyriai paliekami tušti.
////////////////////////////////////////////////////////////////////////////////////////
Kontroliniai klausimai:
1. Bazine klase – Tai klase, is kurios paveldesime visas savybes.
2. Isvestines klases – tai klases, kurios paveldi savybes is bazines klases.
3. Protected prieigines galimybės – tai kintamuosius galima pasiekti pacioje klaseje ir paveldetose
klasese.
4. Isvestines klases konstruktorius reikia rasyti tada, kai bazine klase neturi konstruktoriaus be
parametru.
5. Kaip išvestinėje klasėje yra perduodami bazinės klasės konstruktoriaus parametrai?
Pvz.: Safestack() : Stack(0);
6. Isvestines klases objektas yra konstruojamas tokia seka: is pradziu bazines, tada isvestines.
7. Neišreikštinis išvestinės klasės objekto pertvarkymas į bazinės klasės objekta yra galimas, nes
Isvestinis formatas apima visas bazines savybes ir dar gali jas papildyti.
8. Pertvarkiantysis konstruktorius yra naudojamas tada, kai norime sukonstruoti isvestine klase is
bazines klases. (Kai is bazines I isvestine).
9. Kaip išreikštine forma gali būti pertvarkomas objektas?
Su static_cast.
Kontroliniai klausimai: 11 Paskita
1. Dalinį paveldėjimą reikėtų taikyti, norint nuo išvestinės klasės objektų paslėpti visus bazinių klasių
laukus ir metodus.
2. Daugybinio paveldejimo aprasymo sintakse aprasoma per kableli.
Virtual funkcija turetu buti pasiekiama per pointeri, tam kad ivyktu polimorfizmas.
Virtualios funkcijos prototipai turetu buti toki patys bazinej ir isvestinej funkcijoj.
Klase gali tureti virtualu destruktoriu, bet negali tureti virtualaus kontruktoriaus.
Jei funkcija aprasoma kaip virtual bazinej, o isvestinej klases ji yra tai ji automatiskai
priskiriama kaip virtual.
Reikia virtual destruktoriaus, nes kviest tik bazines jei tokio nebus.
Klasė, kurioje yra bent viena virtuali funkcija, dar vadinama POLIMORFINE.
4. Ką spausdins programa?
#include <iostream>
Using namespace std;
Class Base{
Public: Base(){cout<<“Base“;} };
Class Derived{
Public: Derived() {cout <<“Derived“; };
classFriend: public Base, public Derrived{};
int main(){
Derrived d; Friend f; return 0; }
a. DerivedBaseDerived
b. BaseDerived
c. Kompiliavimo klaida
d. BaseDerivedDerived
6. Kas bus, jei bazė ir išvestinė klasės turės metodus tuo pat vardu?
a. Bazino tipo objektui kviečiamas bazinės klasės objektas METODAS (išvestinės klasės objektui
būtų kviečiamas išvestinės klasės metodas)
b. Kompiliavimo klaida
c. Visad kviečiamas išvestinės klasės metodas
d. Visad kviečiamas bazinės klasės metodas
10. Koks operatorius tikrina, ar kontroliuojamoje sekcijoje įvyko klaida? (ATS IF)
a. Throw
b. Try
c. Catch
d. Nė vienas (if)
18. Norint klasės lauką paslėpti nuo likusios programos dalies, jį reikia deklaruoti:
a. Protected
b. Private
c. Public
d. Restriced
Return 0;}
a. 10
b. 50
c. 40
d. Kom
p
klaid
a
20. Kaip deklaruoti postinkremento perkrovimą?
a. Operator++() (PREINKREMENTAS)
b. Int oeprator ++()
c. Operator++(int)
d. *operator++(int)
27. Ką spausdins
programa?
28. Ka spausdins
programa?
#include
<iostream> Using
namespace std;
Int main(){
Char s[]= “ABCDEF”;
Char*p
=s+3;
Cout<<p<
<endl;
Return 0;}
a. D
b. DEF
c. ABC
d. Komp klaida
32. Kiek iš viso bus sukurta laukų (t.y. kiek ląstelių atminties skirta
duomenims
saugot)?
#include <iostream> Using
legs;};
Int
main
()
{ My
Cat
mc;
Retu
rn 0;
a. 3
b. 1
c. 2
d. Komp klaida ?????????????????????????
33. Ką spausdins
programa?
#include
<iostream> using
namespace std;
Class Animal{
Protected: int legs;
Public: animal():
legs(0){}
};
Class Cat: public Animal{
Private int tail;
Public: Cat(): Animal(), tail(0){}
Void show(){cout<<legs<<tail<<endl;}
};
int main(){
Cat c;
Animal a;
c.show();
a.show();
return0;
}
a. Komp klaida
b. 00
c. 0
d. 11
34. Ką reiškia operatorių perkrovimas?
a. C++ operatoriai dirba su klasių objektais
b. Netinka nė vienas iš išvardintų
c. Suteikiama nauja reikšmė c++ operatoriams
d. Sukuriamas naujas c++ operatorius (c++ neleidžia kurti savų operatorių)
35. Ką spausdins
programa?
#include
<iostream> Using
namespace std;
Class Animal{
a. Cat Animal
b. Cat
c. Animal
d. Komp klaida
38. Kas bus, jei bazinė ir išvestinė klasės turės metodus tuo pat vardu?
a. Visad kviečiamas bazinės klasės metodas
b. Bazinio tipo objektui kviečiamas bazinės klasės objektas (METODAS)
c. visad kviečiamas išvestinės klasės metodas
d. komp klaida
a. Komp klaida
b. Derived Base
c. Base
d. Derived
a. 01
b. 40
c. 41
d. Komp klaida
44. Ką išvestinė klasė gali paveldėti iš bazinės klasės? ( gali būti keli) (negali objektų
paveldėt, konstruktorių su argumentais ir destruktoriaus)
a. Konstruktorius ir destruktorius (konstruktorių gali be argumentų)
b. Tik metodus
c. Tik laukus
d. Laukus ir metodus
45. Jei rodyklei R priskirtas kintamojo K adresas, kaip išspausdinti kintamojo K reikšmę?
a. Cout<<R;
b. Cout<<&R;
c. Cout<<*R;
d. Cout<<<<*K;
46. Ką gali paveldėti išvestinė klasė iš bazinės? (gali būt keli) (private negali paveldėt
nieko)
a. Public metodus
b. Visus laikus
c. Protected laukus
d. Private metodus