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

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

До сего момента считалось, что поля в каждом объекте являются собственностью именно этого объекта и не используются другими объектами этого класса. Например, если записать определение 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; }

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