Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2022-10-10 | 25 |
5.00
из
|
Заказать работу |
|
|
До сего момента считалось, что поля в каждом объекте являются собственностью именно этого объекта и не используются другими объектами этого класса. Например, если записать определение avtoa, b, c; то это означает, что в памяти создаются три объекта. Если возникает необходимость вывести значение поля rashod объекта b, то необходимо указать имя этого объекта и через точку записать имя метода GetRashod (), т.е. b. GetRashod ().
Однако внутри класса программист имеет возможность определять так называемые статические переменные-члены, которые определяются для всего класса, а не для каждого отдельного экземпляра класса. При этом в любой момент объекты класса имеют возможность обращаться к этим данным. Через использование статических элементов можно, например, накапливать некоторую информацию по объектам класса.
1. #include<iostream>
2. usingnamespace std;
3. class avto {
4. public:
5. avto(): cena(8500), rashod(7.2)
6. { SumCena=SumCena+cena; name="Lada";} // 1-йконструктор
7. avto(int p): cena(p), rashod(8.5)
8. { SumCena=SumCena+cena; name="Niva";} // 2-йконструктор
9. avto(int p, int c): cena(p+p*c/100), rashod(6.5)
{ SumCena=SumCena+cena; name="Fiat";} // 3-йконструктор
10. void SetRashod(double rashod1) {rashod=rashod1;}
11. int GetCena() const {return cena;}
12. char* GetName() {return name;}
13. double GetRashod() const {return rashod;}
14. void Output() { cout << name <<" "<< cena <<" "
15. << rashod << endl; }
16. staticint SumCena;
17. private:
18. char* name;
19. int cena;
20. double rashod;
21. };
22. int avto::SumCena = 0;
23. int main()
24. { avto a[4] = {avto(14500,10), avto(), avto(18500), avto()};
25. cout <<"RAZMER MASSIVA = "<<sizeof(a) << endl
26. <<"RAZMER ELEMENTA MASSIVA = "<<sizeof(a[0]) << endl;
27. a[0].Output();
28. a[1].Output();
29. a[2].Output();
30. a[3].Output();
31. cout <<"TOTAL: "<< avto::SumCena << endl;
32. return 0;
33. }
В 16 строке объявляется статическая переменная-член SumCena (типа public) класса avto. В 22 строке эта переменная инициализируется нулем. В каждом из трех конструкторах предусматривается накопление значения этой переменной. В 31 строке продемонстрирован механизм обращения к статической переменной SumCena.
|
Статическую переменную-член класса можно объявлять и в разделе private (см. 19 строку в программе ниже). В этом случае необходимо предусмотреть статическую функцию-член класса, которая обеспечивает доступ к такой переменной. В 17 строке определена такая статическая функция-член класса avto. В 33 строке продемонстрирован механизм обращения к этой функции, когда указывается имя класса и далее имя функции.
1. #include<iostream>
2. usingnamespace std;
3. class avto {
4. public:
5. avto(): cena(8500), rashod(7.2)
6. { SumCena=SumCena+cena; name="Lada";} // 1-йконструктор
7. avto(int p): cena(p), rashod(8.5)
8. { SumCena=SumCena+cena; name="Niva";} // 2-йконструктор
9. avto(int p, int c): cena(p+p*c/100), rashod(6.5)
10. { SumCena=SumCena+cena; name="Fiat";} // 3-йконструктор
11. void SetRashod(double rashod1) {rashod=rashod1;}
12. int GetCena() const {return cena;}
13. char* GetName() const {return name;}
14. double GetRashod() const {return rashod;}
15. void Output() { cout << name <<" "<< cena <<" "
16. << rashod << endl; }
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. }
Дружественные функции.
Традиционно в качестве средств доступа к членам класса выступают общедоступные методы, т.е. функции-члены раздела 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 строках. Отметим, что при определении этой функции в заголовке не нужно указывать имя соответствующего класса.
|
|
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!