C++.Бархатный путь


Класс. Объявление класса - часть 6


За исключением квалифицируемого имени синтаксис определения функции-члена класса вне класса ничем не отличается от определения обычной функции:

int FirstClass::FirstClassFunction(void) { int IntVal = 100; return IntVal; };

Вот таким получилось построенное в соответствии с грамматикой C++ определение (или объявление) класса.

Заметим, что в C++ существует единственное ограничение, связанное с расположением определения функции-члена класса (конечно, если оно располагается вне тела класса): определение должно располагаться за объявлением класса, содержащего эту функцию. Именно "за объявлением"! Без каких-либо дополнительных ограничений типа "непосредственно за" или "сразу за".

Более того, в ряде случаев, например, когда требуется определить функцию-член, изменяющую состояние объекта другого класса, данная функция-член должна располагаться за объявлением класса, состояние объекта которого она изменяет. И это понятно. При разборе такой функции-члена транслятор должен иметь представление о структуре класса.

Допускается и такая схема расположения объявлений, при которой первыми располагаются неполные объявления классов, следом соответствующие объявления классов и лишь затем определения функций-членов. Подобные определения мы будем называть отложенными определениями. Позже мы рассмотрим пример программы, в которой отложенный вариант определения функции-члена является единственно возможным вариантом определения.

Класс - это то, что делает C++ объектно-ориентированным языком. На основе классов создаются новые производные типы и определяются функции, которые задают поведение типа.

Рассмотрим несколько строк программного кода, демонстрирующих свойства производных типов.

class Class1 {int iVal;}; class Class2 {int iVal;}; /* Объявление производных типов Class1 и Class2. Эти объявления вводят в программу два новых производных типа. Несмотря на тождество их структуры, это разные типы. */ void ff(Class1); /* Прототип функции с одним параметром типа Class1.*/ void ff(Class2); /* Прототип функции с одним параметром типа Class2. Это совместно используемые (или перегруженные) функции. Об этих функциях мы уже говорили. */ Class1 m1; /* Объявление объекта m1 типа Class1. */ Class2 m2; /* Объявление объекта m2 типа Class2. */ int m3; m1 = m2; m1 = m3; m3 = m2; /* Последние три строчки в данном контексте недопустимы. Неявное преобразование с участием производных типов в C++ невозможно. Транслятор не имеет никакого понятия о том, каким образом проводить соответствующее преобразование. При объявлении классов необходимо специально определять эти алгоритмы. */ void ff (Class1 pp) // Определение первой совместно используемой функции... { ::::: } void ff (Class2 pp) // Определение второй совместно используемой функции... { ::::: } ff(m1);//Вызов одной из двух совместно используемых функций... ff(m2);//Вызов второй функции...

Ещё один пример объявления класса.

class ClassX { ClassX Mm; //Здесь ошибка. Объявление класса ещё не завершено. ClassX* pMm; //Объект типа "Указатель на объект". Всё хорошо. ClassX FF(char char,int i = sizeof(ClassX)); /* Прототип функции. Второму параметру присваивается значение по умолчанию. И напрасно! Здесь ошибка. В этот момент ещё неизвестен размер класса ClassX. */ // А вот вполне корректное определение встроенной функции. int RR (int iVal) { int i = sizeof(ClassX); return i; } /* Полный разбор операторов в теле функции производится лишь после полного разбора объявления класса. К этому моменту размер класса уже будет определён. */ }

| |

 




- Начало -  - Назад -  - Вперед -