Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 12

 }

В этом примере приведен конструктор инициализации. Он может инициализировать только нестатический элемент данных y. Статическая функция-элемент f_stat() обрабатывает статический элемент данных x. При попытке ввода нестатического элемента данных yего значение не изменится. Статическая функция-элемент не обрабатывает нестатические элементы данных. Зато нестатическая функция-элемент f_non_stat() может осуществлять ввод статического элемента данных x. Если при описании класса приведен прототип статической функции - члена, а сама функция определена позже, то ключевое слово static следует ставить только перед прототипом.

21.2 Константные объекты и константные элементы-функции

Ранее были рассмотрены const элементы-данные. Для их инициализации в конструкторе употреблялся список инициализации. Например:

 class coord
 
 {
 
 const int x, y;
 
 public:
 
 coord (int a, int b): x(a), y(b)
 
{
 
}
 
};

Сейчас речь пойдет не об элементах-данных, а о константных объектах и константных элементах-функциях.

Константные объекты нужны в тех случаях, когда их применяют только для чтения. Изменять их значения нельзя принципиально. И чтобы не сделать это в программе случайно,для работы с константными объектами применяют константные функции-элементы. Эти функциине могут реализовать операцию присваивания элементам-данным константных объектов новых значений. Поэтому константные объекты могут работать (вызывать, связываться) только с константными элементами-функциями. Хотя сами константные функции могут вызываться и неконстантными объектами.

Перед константным объектом пишется ключевое слово с onst. Например:

 class A
 
{
 
 ===========
 
};
 
 void main ( )
 
{
 
constAw ; //w- константный объект 
 
 }

Константная функция-элемент выглядит так:

 classA
 
{
 
 ===========
 
public:
 
тип_результатаимя_функции (параметры)const
 
{
 
 ===========
 
}
 
};

Пример.

 #include <stdio.h>
 
 class A
 
{
 
 int x, y;
 
 public:
 
 A ( )
 
{
 
}
 
 A (int a, int b)
 
{
 
 x=a;
 
 y=b;
 
 }
 
 //Сейчас будет попытка выполнить недопустимое присвоение в
 
// константной функции
 
 void p_const ( ) const
 
{
 
 x=12; // Cannot modify a const object
 
 y=15; // Cannot modify a const object
 
}
 
 //Далее эти же действия выполняет неконстантная функция 
 
void p_non_const ( )
 
{
 
 x=12;
 
 y=15;
 
}
 
};
 
 
 void main ( )
 
 {
 
const A w(1,2);
//w- константный объект
 
Aq ; //q- неконстантный объект 
 
w . p _ const( ); // Разрешается
 
q . p _ const( ); // Разрешается
 
w . p _ non_const( ); // Warning: non-const
 
 // function A::p_non_const ( ) called for
 
 // const object. Это сообщение будет независимо от того
 
 //  есть ли недопустимое присвоение в p_non_const ( ) или нет.
 
 }

Внимание!Константная функция не может включать операцию присвоения для элементов-данных. Нельзя присвоить х=12у=15, как это показано в примере. Но обнаруживается, что компилятор "не замечает", если в константной функции ввести новые значения элементов-данных для константного объекта. Так, например, в константной функции p _ const( ) можно сделать так:

 void p_const ( ) const
 
 {
 
puts (" Введите х, в ");
 
scanf ("%i%i", &x, &y);
 
 }

22.1 Наследование классов

Нередко несколько классов могут иметь одинаковые элементы данных. Например, class student,class teacher, class officer должны иметь такие элементы-данные, как имя, адрес, возраст. В этом случае удобно сделать т.н. базовый класс class man, у которого будут перечисленные общие для нескольких классов элементы данных, а также необходимые члены-функции. А у этого базового класса будут производные от него классы: class student,class teacher, class officer. Эти классы будут использовать элементы базового класса и, кроме этого, иметь свои собственные элементы данных и элементы-функции.