250 likes | 477 Views
Статични член-данни и статични член-функции . Масиви от обекти. Член – данни (член – променливи) : Автоматични Статични. Член - променливи Автоматични член - променливи –> те се инициализират от конструктора при създаването на обект. class primer1 { int n; float x; public:
E N D
Статични член-данни и статични член-функции. Масиви от обекти. • Член – данни (член – променливи) : • Автоматични • Статични
Член - променливи • Автоматични член - променливи –> те се инициализират от конструктора при създаването на обект. class primer1 { int n; float x; public: . . . }; primer1 a, b; a.n a.n a.n a.n b.n b.n b.n b.n b.n a.x a.x a.x a.x b.x b.x b.x b.x Обект a Обект a Обект a Обект a Обект b Обект b Обект b Обект b
Статични член-данни и статични член-функции. Масиви от обекти. • Статични член - променливи • Памет за статична член-променлива се заделя винаги, дори и без да е създаден обект. • Памет се заделя еднократно при задължителното им дефиниране след декларацията на класа. • Обектите от даден клас ползват обща статична член-данна. • Достъпът е възможен чрез името на класа или обект от класа. По подразбиране – стойност = 0 class име_на_клас { static тип име_на статична променлива; . . . }; тип име_на_клас::име_на_статична_променлива = стойност;
Статични член – променливи a.n b.n class primer2 { static int n; float x; public: . . . }; int primer2 :: n; или int primer2 :: n=5; primer2 a, b; a.x b.x Обект a Обект b Подразбираща се инициализация с нула - задължителна Явна инициализация - задължителна
Статични член-данни и статични член-функции. Масиви от обекти. Статични член функции • Те са независими от обектите. • Извикват се чрез името на класа и оператора за действие ::или чрез обект на класа. • Оперират със статични член-данни. Останалите член-данни са недостъпни за тях (свързани са с конкретен обект). class име_на_клас { . . . public: staticтип_на резултатиме_на статична функция(параметри); . . . };
Статични член-данни и статични член-функции. Масиви от обекти. Статични член функции • Пример за статична функция, която извежда броят от обектите. #include <iostream.h> 1/2 class object { static int c; //брой обекти public: object() { c++; cout<<”нов обект\n”; } ~object() { c--; cout<<”разрушен обект\n”; } static void count(); //за извеждане брой обекти }; int object::c;//дефиниция и инициализация с 0 void object::count() //дефиниция на статична функция { cout<<”брой обекти=”<<c<<”\n”; }
Статични член-данни и статични член-функции. Масиви от обекти. Статични член функции • Пример за статична функция, която извежда броят от обектите. void f()2/2 { object u,v; object::count(); } void main() { object::count(); object a; a.count(); f(); object::count(); } брой обекти=0 нов обект брой обекти=1 нов обект нов обект брой обекти=3 разрушен обект разрушен обект брой обект=1 разрушен обект
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Статични или автоматични масиви • Неявно инициализиране – чрез използване на конструктор без параметри – конструкторът се извиква за всеки елемент от масива. • Явно инициализиране - използване на инициализатор – списък от изрази, всяка стойност се предава като параметър на конструктор.
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Статични или автоматични масиви #include <iostream.h> class point { int x,y; public: point(int a=0,int b=0) //конструктор с 0,1,2 параметъра { x=a; y=b; cout<<”конструктор:”<<x<<” “<<y<<”\n”; } }; void main() { int n=3; point line[5]={7,n,2*n+5}; } С инициализатор конструктор:7 0 конструктор 3 0 конструктор:11 0 конструктор:0 0 конструктор:0 0 С конструктора без параметри
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Статични или автоматични масиви • Достъпът до елементите на масива е пряк и се осъществява по стандартния начин – чрез индексирани променливи: line[0], line[1], …line[4] • Възможни са следните обръщения:line[i].out(); или line[i].произволнаІфункция(); • Връзката между масиви и указатели е в сила и в случая когато елементите на масива са обекти. Името на масива е указател към първия му елемент. point *p=line; //р сочи към line[0]
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Статични или автоматични масиви • Пример class example { inta; inttable[10]; public: intarray[10]; } x[5]; . . . x[i].table[j]=33; дефинира масив с 5 компоненти, които са от тип example Достъп до i-ти елемент на масива exampleиj-ти на table
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Статични или автоматични масиви • Пример const NUM = 5; class student { public: void read_student(); void print_student() const; int is_better(student const &) const; double average() const; private: int facnom; char name[26]; double marks[NUM]; }; . . . student table[30]; Няма явно дефиниран конструктор в класа Инициализацията се осъществява чрез извикване на “системния” конструктор по подразбиране за всеки обект – елемент на масива.
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Статични или автоматични масиви • Пример class point {private: int x,y; public: point(int = 0, int =1); void read(); int get_x() const; int get_y() const; voidprint() const; }; . . . point x[10]; // x[i] се инициализира с 0/1, за всяко i=0,1,...9. point x[10] = {1,2,3,4,5,6,7,8,9,10}; //x[i] == i/1 point x[10] = {point(1,21),point(2),point(3, 5),4,5,6,7,8,9,10}; Притежаваявнодефиниран конструктор с два подразбиращи се параметъра Промяна на конструктора в: point(int,int);е грешка
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Динамични масиви • Инициализацията се извършва чрез конструктор без параметри и се прави при дефиниране на масива като конструкторът се извиква за всеки елемент. • Не се допуска предаване на параметри на конструктор чрез инициализатор.
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Динамични масиви - пример #include <iostream.h> 1/2 #include <stdlib.h> #define MAX 5 class tri { float a,b,c; public: tri() { cout<<”конструктор\n”; } ~tri() { cout<<”деструктор\n”; } void init(float i, float j, float k) { a=i; b=j; c=k; } void out() { cout<<”Страни на триъгълник:”<<а<<”,”<<b<<”,”<<c<<”\n”; } }; за инициализация
Статични член-данни и статични член-функции. Масиви от обекти. Масиви от обекти • Динамични масиви - пример Резервиране на памет за динамичен масив – извиква се конструктор void main() 2/2 { tri *array; array=new tri[MAX]; if(!array) exit(1); int x,y,z,i=0; while(cout<<”въведи * за край:”,(getche())!=’*’&&i<MAX) {cout<<”\nx=”; cin>>x; cout<<”y=”; cin>>y; cout<<”z=”; cin>>z; (array[i]).init(x,y,z); (array[i]).out(); i++; } delete []array; } Конструктор – 5 пъти въведи * за край:а х=1 у=2 z=3 страни на триъгълник:1,2,3 въведи * за край:* Деструктор – 5 пъти Инициализира елемент Освобождаване на динамична памет
Масиви от обекти • Пример: Да се състави програма за въвеждане в масив с максимален брой 30 на информация за компютри ( име на модела (name), цена (price) и точки (score) - между 1 и 100). Да се изведе въведената информация, след което да се изведе сортирана в низходящ ред по съотношението точки/цена.
Масиви от обекти #include <iostream.h> 1/6 #include <iomanip.h> #include <string.h> #define MAX 30 class product { private: char name[21]; double price; int score; public: void read(); void print() const; int is_better_from(product const &) const; double get_price() const; int get_score() const; }; Декларация на клас
void sorttable(int n, product* []); 2/6 void main() {product table[MAX]; product* ptable[MAX]; int n; do {cout << “брой продукти? "; cin >> n; } while (n<1 || n>MAX); int i; for (i = 0; i <= n-1; i++) { table[i].read(); ptable[i] = &table[i]; } cout << “масив - начален: \n"; for (i = 0; i <= n-1; i++) { table[i].print(); cout << endl; } Масиви от обекти Декларация на външна функция за рбота с масива Дефиниране на масив от обекти и масив от указатели към обекти Попълване на двата масива Извеждане на началния масив
Масиви от обекти sorttable(n, ptable); 3/6 cout << "\n нов масив след сортиране: \n"; for (i = 0; i <= n-1; i++) {ptable[i]->print(); cout << setw(7) << ptable[i]->get_score()/ptable[i]->get_price() << endl; } } Сортиране на масива Извеждане на сортирания масив
Масиви от обекти void product::read() 4/6 {cout << "name: "; cin >> name; cout << "price: "; cin >> price; cout << "score: "; cin >> score; } void product::print() const {cout << setw(25) << name << setprecision(2)<<setw(10)<<price << setw(12) << score; } Дефиниране на член функция за попълване на обект Дефиниране на член функция за извеждане на обект
Масиви от обекти int product::is_better_from(product const & x) const 5/6 {return score/price > x.score/x.price; } double product::get_price() const {return price; } int product::get_score() const {return score; } Дефиниране на член функция за сравнение Дефиниране на интерфейсна член функция Дефиниране на интерфейсна член функция
Масиви от обекти void sorttable(int n, product* a[]) 6/6 {for (int i = 0; i <= n-2; i++) {int k = i; product* max = a[i]; for (int j = i+1; j <= n-1; j++) if (a[j]->is_better_from(*max)) {max = a[j]; k = j; } max = a[i]; a[i] = a[k]; a[k] = max; } } Дефиниция на външна функция за рбота с масива
Масиви от обекти брой продукти? 3 name: aaa price: 1000 score: 77 name: bbb price: 500 score:11 name: ccc price: 800 score: 44 масив – начален: ааа 1000.00 77 bbb 500.00 11 ccc 800.50 44 нов масив след сортиране: aaa 1000.00 77 0.08 bbb 800.50 44 0.05 ccc 500.00 11 0.02 Резултати от изпълнение на програмата