История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Интересное:
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
2022-10-10 | 24 |
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!