Статические переменные-члены и функции-члены класса. — КиберПедия 

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Статические переменные-члены и функции-члены класса.

2022-10-10 24
Статические переменные-члены и функции-члены класса. 0.00 из 5.00 0 оценок
Заказать работу

До сего момента считалось, что поля в каждом объекте являются собственностью именно этого объекта и не используются другими объектами этого класса. Например, если записать определение 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.02 с.