«Исторически все заголовочные файлы имеют расширение .h, но эта традиция изменена текущим стандартом С++. Теперь системные заголовочные файлы не имеют вообще никакого расширения. Тем не менее многие программисты продолжают использовать расширение .h, которое позволяет сразу отделить заголовочные файлы от файлов с исходными текстами.»
[Советы]
Полученный в результате файл Student.h выглядит следующим образом.
/* Student — базовый класс */
#ifndef _STUDENT_
#define _STUDENT_
namespace Schools
{
class Student
{
public :
Student( char* pszName , int nID ) ;
virtual char* display( ) ;
protected :
/* Имя студента */
char* pszName ;
int nID ;
} ;
}
#endif
#ifndef представляет собой директиву препроцессора, такую же, как и, например, директива #include. Данная директива гласит, что включать следующие за ней строки следует только в том случае, когда её аргумент _STUDENT_ не определён. При первом включении файла _STUDENT_ не определён, но тут же определяется директивой #define_STUDENT_. Это приводит к тому, что включение файла Student.h в программу будет выполнено только один раз, независимо от того, сколько директив #include встретится в программе.
_________________
260 стр. Часть 4. Наследование
Определение пространства имён...261
Следующая особенность программы состоит в том, что класс Student определён в пространстве имён Schools.
Пространство имён представляет собой множество тесно связанных классов, в чём-то логически подобных друг другу. В нашем случае я хочу поместить все создаваемые классы, представляющие студентов, аспирантов и т.п. в одно пространство имён Schools.
Классы, составляющие пространство имён Schools, выглядят как члены одной семьи. Один класс из пространства имён может обращаться к другому классу из этого же пространства имён непосредственно, в то время как внешние классы должны явно указывать при обращении пространство имён.
«Ещё одной причиной для использования пространств имён служат так называемые "коллизии имён", которых надо избегать. Например, класс Grade из пространства имён Schools никак не влияет на возможность использования этого же имени для класса в пространстве имён FoodProduction.»
[Советы]
Реализация класса student...261
Реализация класса Student помещена мною в файл Student.срр.
/* Student — реализация методов класса Student */
#include
#include
#include
#include
#include "student.h"
namespace Schools
{
Student::Student( char* pszNameArg , int nIDArg )
: nID( nIDArg )
{
pszName = new char[ strlen( pszNameArg ) + 1 ] ;
strcpy( pszName , pszNameArg ) ;
}
/* display — возвращает описание студента */
char* Student::display( )
{
/* Копируем имя студента в блок памяти в куче, который возвращается вызывающей функции */
char* pReturn = new char[ strlen( pszName ) + 1 ] ;
strcpy( pReturn , pszName ) ;
return pReturn ;
}
}
Конструктор Student копирует имя и идентификатор студента, переданные ему в качестве аргументов. Виртуальная функция display( ) возвращает строку с описанием объекта Student.
Компиляция файла Student.срр даёт промежуточный файл, который затем может быть быстро объединён с другими файлами в завершённую выполнимую программу.
_________________
261 стр. Глава 22. Разложение классов
«По историческим причинам в большинстве сред С++ этот промежуточный файл имеет расширение .obj или .о ( "объектный файл" ).»
[Технические подробности]