Примечание:
Выполнение с подстановкой
Можно выполнять подстановку методов с помощью ключевого слова inline точно так же, как это делалось с обычными функциями. Для этого ключевое слово inline нужно разместить перед типом возвращаемого значения. Например, определение подставляемой функции-члена GetWeight имеет следующий вид:
inline intCat::GetWeight
{
return itsweight; // возвращает переменную-член Weight
}
Можно также поместить определение функции в объявление класса, что автоматически делает такую функцию подставляемой:
class Cat
{
public:
int GetWeight { return itsWeight; } // подставляемая функция
void SetWeight(int aWeight);
};
Обратите внимание на синтаксис определения функции GetWeight. Тело подставляемой функции начинается сразу же после объявления метода класса, причем после круглых скобок нет никакой точки с запятой. Подобно определению обычной функции, определение метода начинается с открывающей фигурной скобки и оканчивается закрывающей фигурной скобкой. Как обычно, пробелы значения не имеют, и то же самое определение можно записать несколько иначе:
class Cat
{
public:
int GetWeight const
{
return itsWeight;
} // подставляемая функция
void SetWeight(int aWeight);
};
В листингах 6.6 и 6.7 вновь создается класс Cat, но в данном случае объявление класса содержится в файле CAT.hpp, а выполнение — в файле CAT.cpp. Кроме того, в листинге 6.7 метод доступа к данным класса и метод Meow являются подставляемыми.
Листинг 6.6. Объявление класса CAT в файле CAT.hpp
1: #include
2: class Cat
3; {
4: public:
5: Cat (int initialAge);
6: ~Cat;
7: int GetAge const { return itsAge;) // подставляемая функция!
8: void SetAge (int age) { itsAge = age;} // подставляемая функция!
9: void Meow const { cout << "Мяу.\n";} // подставляемая функция!
10: private:
11: int itsAge;
12: };
Листинг 6.7. Выполнение масса Cat в файле CAT.cpp
1: // Пример использования подставляемых функций
2: // и включения файла заголовка
3:
4: #include "cat.hpp" // не забудьте включить файл заголовка!
5:
6:
7: Cat::Cat(int initialAge) //конструктор
8: {
9: itsAge = initialAge;
10: }
11:
12: Cat::~Cat // деструктор, не выполняет никаких действий
13: {
14: }
15:
16: // Создаем виртуальную кошку, устанавливаем ее возраст, разрешаем
17: // ей мяукнуть, сообщаем ее возраст, затем снова "мяукаем" и изменяем возраст кошки.
18: int main
19: {
20: Cat Frisky(5);
21: Frisky.Meow;
22: cout << "Frisky is а cat who is ";
23: cout << Frisky.QetAge << " years old.\n";
24: Frisky.Meow;
25: Frisky.SetAge(7);
26: cout << "Now Frisky is " ;
27: cout << Frisky.GetAge << " years old.\n";
28: return 0;
29: }
Результат:
Meow.
Frisky is а cat who is 5 years old.
Meow.
Now Frisky is 7 years old.
Анализ:
Программа, представленная в листингах 6.6 и 6.7, аналогична программе из листинга 6.4 за исключением того, что три метода класса объявляются подставляемыми, а само объявление класса вынесено в файл заголовка CAT.hpp.В строке 7 объявляется функция GetAge и тут же следует определение ее выполнения. Строки 8 и 9 занимают объявления еще двух встроенных функций, но их определения содержатся в другом файле.
В строке 4 листинга 6.7 с помощью команды #include "cat.hpp" в программу включается содержимое файла CAT.hpp. Компилятор получает команду считать содержимое файла cat .hpp и ввести его в данный файл, начиная со строки 5.