Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lucik_op.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.88 Mб
Скачать

Компоненты-функции static и const

В С++ компоненты-функции могут использоваться с модификатором static и const. Обычная компонента-функция, вызываемая

object . function(a,b);

имеет явный список параметров a и b и неявный список параметров, состоящий из компонент данных переменной object. Неявные параметры можно представить как список параметров, доступных через указатель this. Статическая (static) компонента-функция не может обращаться к любой из компонент посредством указателя this. Компонента-функция const не может изменять неявные параметры.

#include "iostream.h"

class cls

{ int kl; // количество изделий

double zp; // зарплата на производство 1 изделия

double nl1,nl2; // два налога на з/пл

double sr; // кол-во сырья на изделие

static double cs; // цена сырья на 1 изделие

public:

cls(){} // конструктор по умолчанию

~cls(){} // деструктор

void inpt(int);

static void vvod_cn(double);

double seb() const;

};

double cls::cs; // явное определение static-члена в контексте файла

void cls::inpt(int k)

{ kl=k;

cout << "Введите з/пл и 2 налога";

cin >> nl1 >> nl2 >> zp;

}

void cls::vvod_cn(double c)

{ cs=c; // можно обращаться в функции только к static-компонентам;

}

double cls::seb() const

{return kl*(zp+zp*nl1+zp*nl2+sr*cs);//в функции нельзя изменить ни один

} // неявный параметр (kl zp nl1 nl2 sr)

void main()

{ cls c1,c2;

c1.inpt(100); // инициализация первого объекта

c2.inpt(200); // инициализация второго объекта

cls::vvod_cn(500.); //

cout << "\nc1" << c1.seb() << "\nc2" << c2.seb() << endl;

}

Ключевое слово static не должно быть включено в описание объекта статической компоненты класса. Так, в описании функции vvod_cn отсутствует ключевое слово static. В противном случае возможно противоречие между static- компонентами класса и внешними static-функциями и переменными.

Следующий далее пример демонстрирует доступ к static данным класса из различных функций.

#include "iostream.h"

class cls

{ static int i;

int j;

public:

static int k; // объявление static-члена в объявлении класса

void f1();

static void f2();

};

int cls::k=0; // явное определение static-члена в контексте файла

int cls::i=0;

void cls::f1() // из функции класса возможен доступ

{ cout << ++k<<' '<<++i<< endl;}// к private и public static данным

void cls::f2() // из static функции класса возможен

{ cout <<++k<<' '<<++i<<endl;} // доступ к private и public static данным

void f3() // из внешней функции возможен

{cout<<++cls::k<<endl;} // доступ только к public static данным

void main()

{ cls obj;

cout << cls::k<<endl; // возможен доступ только к public static данным

obj.f1();

cls::f2();

f3();

}

Результат работы программы:

0

1 1

2 2

3

Функции класса, объявленные со спецификатором const, могут быть вызваны для объекта со спецификатором const, а функции без спецификатора const - не могут.

const cls c1;

cls c2;

c1.inpt(100); // неверный вызов

c2.inpt(100); // правильный вызов функции

c1.seb(); // правильный вызов функции

Для функций со спецификатором const указатель this имеет следующий тип:

const имя_класса * const this;

Следовательно, нельзя изменить значение компоненты объекта через указатель this без явной записи. Рассмотрим это на примере функции seb.

double cls::seb() const

{ ((cls *)this)->zp--; // возможная модификация неявного параметра

// zp посредством явной записи this-указателя

return kl*(zp+zp*nl1+zp*nl2+sr*cs);

}

Если функция, объявленная в классе, описывается отдельно (вне класса), то спецификатор const должен присутствовать как в объявлении, так и в описании этой функции.

Основные свойства и правила использования static- и const- функций:

- статические компоненты-функции не имеют указателя this, поэтому обращаться к нестатическим компонентам класса можно только с использованием . или ->;

- не могут быть объявлены две одинаковые функции с одинаковыми именами и типами аргументов, при этом одна статическая, а другая нет;

  • статические компоненты-функции не могут быть виртуальными.

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