Глава 8
Вверх
//Listing 9.11
// Passing pointers to objects
class SimpleCat
{
int GetAge() const {
private:
SimpleCat::SimpleCat()
{
SimpleCat::SimpleCat(SimpleCat&)
{
SimpleCat::~SimpleCat()
{
const SimpleCat * const FunctionTwo (const SimpleCat * const theCat);
int main()
{
int age = 5;
cout << "Calling FunctionTwo...\n";
cout << "Frisky is " ;
// functionTwo, passes a const pointer
const SimpleCat * const FunctionTwo
Результат:
3.Frisky is 1 years old
5.Calling FunctionTwo...
8.Frisky is 5 years old
Анализ:
Как видим в класс добавлена постоянная функция GetAge()
и функция которая не является постоянной SetAge().
Так же добавлена переменная-член itsAge.
Конструктор, конструктор копий и деструктор по прежнему выводят на экран
свои сообщения. Конструктор копий ни разу не вызывался поскольку
объект был передан как ссылка.
Во второй строке главной программы был создан объект со значением
возраста заданным по умолчанию. В следующих строках это значение
выводится на экран.
cout << "Frisky is " ;
Вот как вывел компьютер на экран результат этих инструкций
Далее переменной itsAge присваивается новое значение и с помощью
функции SetAge() происходит изменение этого значения внутри класса
у закрытого члена.
cout << "Frisky is " ;
Смотри сообщение 4.
Вот как вывел компьютер результат этих инструкций:
В этой программе функция FunctionTwo() слегка изменена.Вот ее объявление
На этот раз и параметр и возвращаемое значение объявляются как постоянные
указатели на постоянные объекты.
Вот инструкции этой функции:
Вот как вывел компьютер на экран результат этих инструкций:
Поскольку и параметр и возвращаемое значение передаются как ссылки,
(да еще через указатели!)ни какие копии не создаются и конструктор копий
не вызывается.
Но указатель в функции теперь является постоянным,
следовательно к нему не может применяться непостоянная функция SetAge().
Если бы обращение к функции SetAge() не было закомментировано,
то программа не прошла бы этап компиляции.
Обратите внимание что объект создаваемый в функции main() не является
постоянным, и объект Frisky может вызвать функцию SetAge(). Адрес этого
обычного объекта передается функции FunctionTwo() но поскольку в объявлении
функции FunctionTwo() заявлено что передаваемый указатель должен быть
постоянным указателем на постоянный объект , то с этим объектом функция
обращается так, как если бы он был постоянным!.
И наконец последние инструкции из главной программы:
Вот как вывел компьютер на экран результат этих инструкций:
И наконец окончание функции main()
Назад |
Начало урока |
Вверх |
Вперед
Передача постоянного указателя.
Решить проблему можно передав в функцию указатель на постоянный объект.
В этом случае к объекту могут применяться только постоянные методы,
не имеющие прав на изменение объекта.
#include <iostream>
using namespace std;
SimpleCat();
SimpleCat(SimpleCat&);
~SimpleCat();
void SetAge(int age) {
int itsAge;
cout << "Simple Cat Constructor...\n";
itsAge = 1;
cout << "Simple Cat Copy Constructor...\n";
cout << "Simple Cat Destructor...\n";
cout << "Making a cat...\n";
SimpleCat Frisky;
cout << "Frisky is " ;
cout << Frisky.GetAge();
cout << " years old\n";
Frisky.SetAge(age);
cout << "Frisky is " ;
cout << Frisky.GetAge();
cout << " years old\n";
FunctionTwo(&Frisky);
cout << Frisky.GetAge();
cout << " years old\n";
return 0;
(const SimpleCat * const theCat)
{
cout << "Function Two. Returning...\n";
cout << "Frisky is now " << theCat->GetAge();
cout << " years old \n";
// theCat->SetAge(8); const!
return theCat;
1.Making a cat...
2.Simple Cat Constructor...
4.Frisky is 5 years old
6.Function Two. Returning...
7.Frisky is now 5 years old
9.Simple Cat Destructor...
int GetAge() const {
void SetAge(int age) {
private:
int itsAge;
SimpleCat Frisky;
cout << Frisky.GetAge();
cout << " years old\n";
1.Making a cat...
2.Simple Cat Constructor...
3.Frisky is 1 years old
Затем вызов функции чтобы убедиться что изменение закрытой переменной
произошло.
int age = 5;
Frisky.SetAge(age);
cout << Frisky.GetAge();
cout << " years old\n";
4.Frisky is 5 years old
const SimpleCat * const FunctionTwo
(const SimpleCat * const theCat);
cout << "Function Two. Returning...\n";
cout << "Frisky is now " << theCat->GetAge();
cout << " years old \n";
5.Calling FunctionTwo...
6.Function Two. Returning...
7.Frisky is now 5 years old
// theCat->SetAge(8); const!
cout << "Frisky is " ;
cout << Frisky.GetAge();
cout << " years old\n";
8.Frisky is 5 years old
Комньютер выводит последнее сообщение:
9.Simple Cat Destructor...
Содержание