Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shprora_po_proge.docx
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
518.78 Кб
Скачать

17. Staticint GetSumCena() { return SumCena; };

18. private:

19. Staticint SumCena;

20. char* name;

21. int cena;

22. double rashod;

23. };

24. int avto::SumCena = 0;

25. int main()

26. {avto a[4] = {avto(14500,10), avto(), avto(18500), avto()};

27. cout <<"RAZMER MASSIVA = "<<sizeof(a) << endl

28. <<"RAZMER ELEMENTA MASSIVA = "<<sizeof(a[0]) << endl;

29. a[0].Output();

30. a[1].Output();

31. a[2].Output();

32. a[3].Output();

33. cout <<"TOTAL: "<< avto::GetSumCena() << endl;

34. return 0;

35. }

16 Дружественные функции.

Традиционно в качестве средств доступа к членам класса выступают общедоступные методы, т.е. функции-члены раздела public:. Такое ограничение часто является жестким, а потому в языке С++ был реализован механизм использования дружественных функций. В этом случае предусматривается, что внутри класса могут размещаться прототипы функций, которые не будут являться членами класса, а будут выступать в роли дружественных. В прототипе при этом перед заголовком соответствующей функции размещается служебное слово friend.

1. #include<iostream>

2. usingnamespace std;

3. class avto {

4. public:

5. avto(): cena(8700),rashod(9.2) {name="Lada";} //конструктор

6. ~avto(){cout <<"Object destroy!!! "<< endl;} // деструктор

7. void SetRashod(double rashod1) {rashod=rashod1;}

8. Friendvoid GetFields(avto&);

9. private:

10. char* name;

11. int cena;

12. double rashod;

13. };

14. void GetFields(avto& a)

15. { cout << "CENA -> "<< a.cena << endl <<

16. "MARKA -> "<< a.name << endl <<

17. "RASHOD -> "<< a.rashod << endl;

18. }

19. int main()

20. { avto B; B.SetRashod(11.7); GetFields(B);

21. avtoF; GetFields(F);

22.return 0;

23. }

В строках с 3 по 13 включительно определен класс avto. Внутри определения класса присутствует прототип дружественной функции GetFields() (см. стр. 8). Определение дружественной функции GetFields() размещается в 14-18 строках. Отметим, что при определении этой функции в заголовке не нужно указывать имя соответствующего класса.

17 Класс, содержащий переменную-член типа класс.

Иногда возникает необходимость внутри класса определить переменную-член (поле), которая является экземпляром другого класса. Рассмотрим пример, в котором определяется класс avto, содержащий три ранее используемых поля name, cena и rashod, и еще одно поле date_vypuska, которое будет иметь тип classDate_Avto.

1. #include<iostream>

2. usingnamespace std;

3. Class Date_Avto {

4. public:

5. Date_Avto() : day(1), month("May"), year(2010)

6. { cout <<"HELLO from Date_Avto !!!"<< endl; }

7. ~Date_Avto() { cout <<"OBJECT Date_Avto destroy !!!"

8. << endl; }

9. void OutPut() { cout << day <<'-'<< month <<'-'

10. << year << endl; }

11. private:

12. int day;

13. char* month;

14. int year;

15. };

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]