Выбрать главу

   itsRadius = new int(val);

}

SimpleCircle::~SimpleCircle()

{

   delete itsRadius;

}

SimpleCircleS SimpleCircle :operator=(const SimpleCircle & rhs)

{

   if (this == &rhs)

      return <<this;

   *itsRadius = rhs.GetRadius();

   return *this;

}

const SimpleCircle& SimpleCircle::operator++()

{

   ++(*itsRadius);

   return *this;

}

// Постфиксный оператор Operator ++(int).

// Выборка, затем инкрементирование

const SimpleCircle SimpleCircle::operator++ (int)

{

   // объявляем локальный объект класса SimpleCircle и инициализируем его значением

   *this

      SimpleCircle ternp(*this);

      ++(*itsRadius);

      return temp;

}

int SimpleCircle::GetRadius() const

{

   return ~itsRadius;

}

int main()

{

   SimpleCircle CircleOne, CircleTwo(9);

   CircleOne++;

   ++CircleTwo;

   cout << "CircleOne: " << CircleOne.GetRadius() << endl;

   cout << "CircleTwo: " << CircleTwo.GetRadius() << endl;

   CircleOne = CircleTwo;

   cout << "CircleOne: " << CircleOne.GetRadius() << endclass="underline"

   cout << "CircleTwo: " << CircleTwo.GetRadius() << endl;

   return 0;

}

9. Жучки: что неправильно в следующем примере использования оператора присваивания?

SQUARE SQUARE::operator=(const SQUARE & rhs)

{

   itsSide - new int;

   *itsSide = rhs.GetSide();

   return *this;

}

Нужно выполнить проверку на равенство объектов rhs и this, в противном случае обращение к оператору а = а приведет к аварийному отказу вашей программы.

10. Жучки: что неправильно в следующем примере использования оператора суммирования?

VeryShort VeryShort::operator+ (const VeryShort& rhs)

{

   itsVai += rhs.GetltsVal();

   return *this;

}

Этот оператор operator+ изменяет значение в одном из операндов, а не создает с помощью суммирования новый объект VeryShort. Правильно написать следующее:

VeryShort VeryShort::operator+ (const VeryShort& rhs)

{

   return VeryShort(itsVal + rhs.GetltsVal());

}

День 11

Контрольные вопросы 

1. Что такое v-таблица?

V-таблица, или таблица виртуальных функций, является обычным средством управления виртуальными функциями в C++, используемым компилятором. Эта таблица хранит список адресов всех виртуальных функций и обеспечивает вызов правильной функции в зависимости от указываемого типа объекта во время выполнения программы.

2. Что представляет собой виртуальный деструктор?

Деструктор любого класса, который может быть объявлен виртуальным. Во время выполнения программы при применении delete к указателю на определенный тип объекта будет вызван деструктор соответствующего типа.

3. Можно ли объявить виртуальный конструктор?

Виртуальных конструкторов не существует.

4. Как создать виртуальный конструктор-копировщик?

Путем создания в классе виртуального метода, который вызывает конструктор-копировщик.

5. Как вызвать функцию базового класса из объекта производного класса, если в производном классе эта функция была замещена?

Base::FunctionName();

6. Как вызвать функцию базового класса из объекта производного класса, если в производном классе эта функция не была замещена?

FunctionName():

7. Если в базовом классе функция объявлена как виртуальная, а в производном классе виртуальность функции указана не была, сохранится ли функция как виртуальная в следующем произведенном классе?

Да, виртуальность наследуется и не может быть отменена.

8. С какой целью используется ключевое слово protected?

Защищенные члены (которые объявлены с использованием ключевого слова protected) доступны для функций-членов производных объектов.

 Упражнения

1. Объявите виртуальную функцию, которая принимает одно целочисленное значение и возвращает void.

virtual void SomeFunction(int);

2. Запишите объявление класса Square (квадрат), произведенного от класса Rectangle (прямоугольник), который, в свою очередь, произведен от класса Shape (форма).

class Square : public Rectangle

{ };

3. Предположим, что в предыдущем примере объект класса Shape не использует параметры, объект класса Rectangle принимает два параметра (length и width), а объект класса Square — один параметр (length); запишите конструктор для класса Square.

Square::Square(int length):

   Rectangle(length, length)}}

4. Запишите виртуальный конструктор-копировщик для класса Square, взятого из упражнения 3.

class Square

{

   public:

      // ...

      virtual Square * clone() const { return new Square(*this); }

      // ...

};

5. Жучки: что неправильно в следующем программном коде?