Освой самостоятельно С++ за 21 день.
Шрифт:
private:
int *itsRadius;
};
SimpleCircle::SimpleCircle
{itsRadius = new int(5);}
SimpleCircle::SimpleCircle(int radius)
{itsRadius = new int(radius);}
SimpleCircle::SimpleCircle(const SimpleCircle & rh$)
{
int val = rhs.GetRadius;
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;
}
//
// Выборка, затем инкрементирование
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 << endl:
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: