Пояснения и примери:

Поясненията са в съвсем съкратен вид, и не трябва да се разглеждат като изчерпателен материал, а единствено като обяснение на по-съществените понятия, необходими за решаването на конкретните задачи.

  • Класове:
    Клас = данни + методи за тяхната обработка.

    Данните са стандартни ( int, float, char и пр., указатели, масиви) или потребителски типове данни. Обикновено, те трябва да са видими (достъпни) само в рамките на класа, затова се дефинират в 'private' раздела на класа.

    Методите са функции, които работят директно с данните на дадения клас. Съществена разлика между метод и обикновена функция е факта, че метода има достъп до скритите (private) данни на класа, докато функциите нямат. Именно чрез методите се осъществява достъп до данните на класа от главната програма. Поради това методите се декларират в 'public'раздела на класа, тъй като те трябва да бъдат видими извън класа.

    Пример:

    // Клас, описващ математическото понятие дроб, като нещо, което се състои от:
    // числител - цяло число,
    // знаменател - цяло число,
    // възможност да бъде прочетено от клавиатурата,
    // възможност да бъде изписано на екрана.
    
    class drob {
    	int ch;
    	int zn;
    public:
    	read_drob();
    	print_drob();
    };
    

    В така дефинирания клас, действията, които може да извършваме с една дроб са единствено : четене от клавиатура и изписване на екрана. Тези действия ще се реализират от методите read_drob() и print_drob(), които може да дефинираме като:

    drob::read_drob(){
    	cout<<"Vyvedete chislitelya na drobta: ";
    	cin>>ch;
    	//знаменателят не може да бъде 0 =>
    	do {
    		cout<<"Vyvedete znamenatelya na drobta: ";
    		cin>>zn;
    	} while (zn==0);
    };
    
    drob::print_drob(){
    	cout<<endl<<"Vyvedenata ot vas drob e: "<<ch<<'/'<<zn<<endl;
    };
    
  • Обекти:

    Класовете в С++ по същество представляват нов тип данни. След като сме дефинирали класа drob и неговите методи може да работим с променливи от тип drob в нашата програма по същия начин, по който работим с променливи от стандартните типове данни (int, float, double, char и пр.).

    Например:

    int x;  //заделя 4B за променливата x
    drob d; // заделя 8B  за променливата d (или иначе казано: за обекта d на класа drob)
    

    Ето как, най-общо, ще изглежда оперативната памет след горните дефиниции:

    разпределение на паметта
    !Променливи от даден тип клас се наричат обекти на дадения клас. Казва се, че обектите са екземпляри на класовете.
  • Достъп до членовете (данни и методи) на обект:

    След като сме създали обект от даден клас, за да работим с него, ние трябва да можем да извикваме неговите методи, или ако има публични данни, да четем/записваме стойности от/в тях.

    Достъпа до метод или данна на обект се извършва чрез оператора точка (.)

    Нека е дадена следната дефиниция на класа Box, който описва понятието кутия като съвкупност от стойности за дължината, широчината и височината на кутията, плюс методи за въвеждане/извеждане на тези стойности, както и метод за изчисляване на обема на кутията.

    class Box {
    public:
    	//данни:
    	int length;	//дължина
    	int width;	//широчина
    	int height;	//височина
    	//методи:
    	void read_box();	//метод за въвеждане на размерите на кутията от потребителя
    	void print_box();	//метод за изписване на размерите на кутията на екрана
    	int  volume();		//метод, който изчислява обема на кутията
    };
    int main() {
    	Box b; 		// b е обект на класа Box
    	b.length=20;	//задаваме стойност за дължината на b
    	b.width=40;	//задаваме стойност за широчината на b
    	b.height=40;	//задаваме стойност за височината на b
    	b.print_box();	//извикваме метода print_box() за обекта b
    }
    
    Забележете, че в случая данните са декларирани в public секцията на класа => достъпа до тях от главната програма е възможен.

Задачи за упражнение

  1. Задача:

    Програма, която дава възможност на потребителя да въведе две дроби и извежда на екрана сумата от тези две дроби. Дробите се представят като обекти на клас drob, с необходимите методи за въвеждане и извеждане. Сумирането се извършва от функция - sum_drob()

    Примерно решение:

    #include "iostream.h"
    //////////////////////////////////////////////////////////////////////////////////////////////////
    //  ----------------  Дефиниция на класа drob ----------------------- //
    class drob {
    	int ch;	//числителя на дробта
    	int zn;	//знаменателя на дробта
    public:
    	int get_ch();	//метод за достъп до числителя
    	int get_zn();	//метод за достъп до знаменателя
    	void set_ch(int);	//метод за запис на цяло число в числителя
    	void set_zn(int);	//метод за запис на цяло число в знаменателя
    	void read_drob();	//метод за въвеждане на дроб от клавиатурата
    	void print_drob();	//метод за изписване на дроб на екрана
    };
    //////////////////////////////////////////////////////////////////////////////////////////////////
    //  -----------  Дефиниции на методите на класа drob ------------ //
    //
    //дефиниция на метода get_ch() : 
    int drob::get_ch(){
    	return ch;
    };
    //дефиниция на метода get_zn() :
    int drob::get_zn(){
    	return zn;
    };
    //дефиниция на метода set_ch() :
    void drob::set_ch(int c){
    	ch=c;
    };
    //дефиниция на метода set_zn() :
    void drob::set_zn(int z){
    	zn=z;
    };
    //дефиниция на метода read_drob() :
    void drob::read_drob(){
    	cout<<"Vyvedete chislitelya na drobta: ";
    	cin>>ch;
    	// Знаменателят не може да бъде 0 =>
    	do {
    		cout<<"Vyvedete znamenatelya na drobta: ";
    		cin>>zn;
    	} while (zn==0);
    };
    //дефиниция на метода print_drob() :
    void drob::print_drob(){
    	cout<<ch<<'/'<<zn<<endl;
    };
    //////////////////////////////////////////////////////////////////////////////////////////////////
    //дефиниция на функцията sum_drob(): 
    drob sum_drob(drob d1, drob d2) {
    	drob res;  // дробта, която ще върнем като сума
    	res.set_ch( d1.get_ch() * d2.get_zn()  +  d2.get_ch() * d1.get_zn() );
    	res.set_zn( d1.get_zn() * d2.get_zn() );
    	return res;
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////
    //  --------------------  Главна програма ----------------------- //
    //
    int main(){
    	drob a,b;
    	cout<<"Vyvezhdane na 1-ta drob:"<<endl;
    	a.read_drob();
    	cout<<endl<<"Vyvezhdane na 2-ta drob:"<<endl;
    	b.read_drob();
    	drob res;
    	res=sum_drob(a,b);
    	cout<<endl<<"Sumata na dvete drobi e: ";
    	res.print_drob();
    	return 0;
    };