Джесс Либерти - Освой самостоятельно С++ за 21 день.
- Название:Освой самостоятельно С++ за 21 день.
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джесс Либерти - Освой самостоятельно С++ за 21 день. краткое содержание
В книге широко представлены возможности новейшей версии программного продукта Microsoft Visual C++. Подробно описаны средства и подходы программирования современных профессиональных приложений. Материалы книги дополнены многочисленными демонстрационными программами, в процессе разработки которых максимально используются возможности программных инструментов Microsoft Visual Studio. Особое внимание уделено новинкам версии 6.0 и новейшим технологиям объектно-ориентированного программирования, включая использование библиотеки MFC и шаблонов классов, а также создание связанных списков. Отдельное занятие посвящено вопросам объектно-ориентированного анализа и проектирования приложений. Подробно рассмотрены все средства и подходы конструирования собственных пользовательских классов.
Книга рассчитана на широкий круг читателей, интересующихся современными проблемами программирования.
Освой самостоятельно С++ за 21 день. - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
class SimpleCircle
{
public:
SimpleCircle();
~SimpleCircle();
void SetRadius(int);
int GetRadiusO;
private:
int itsRadius;
};
2. Используя класс, созданный в упражнении !, с помошью конструктора, заданного по умолчанию, инициализируйте переменную itsRadius значением 5.
SimpleCircle::SimpleCircle():
itsRadius(5);
{ }
3. Добавьте в класс новый конструктор, который присваивает значение своего пара-
метра переменной itsRadius.
SimpleCircle::SimpleCircle(int radius):
itsRadius(radius)
{ }
4. Перегрузите операторы преинкремента и постинкремента для использования в ва-
шем классе SimpleCircle с переменной itsRadius.
const SimpleCircle& SimpleCircle::operator++()
{
++(itsRadius);
return *this;
}
// постфиксный оператор Operator ++(int).
// Выборка, затем инкрементирование
const SimpleCircle SimpleCircle::operator++ (int)
// обьявляем локальный обьект класса SimpleCircle и инициализируем его значением
* this
SimpleCircle temp(*this);
++(itsRadius);
return temp;
}
5. Измените SimpleCircle таким образом, чтобы сохранять itsRadius в динамической области памяти и фиксировать существующие методы.
class SimpleCircle
{
public:
SimpleCircle();
SimpleCircle(int);
~SimpleCircle();
void SetRadius(int);
int GetRadius();
const SimpleCircle& operator++();
const SimpleCircle operator++(int);
private:
int *itsRadius;
};
SimpleCircle::SimpleCircle()
{itsRadius = new int(5);}
SimpleCircle::SimpleCircle(int radius)
{itsRadius = new int(radius);}
SimpleCircle::~SimpleCircle()
{
delete itsRadius;
}
const SimpleCircle& SimpleCircle::operator++()
{
++(*itsRadius);
return <
}
// Постфиксный оператор Operator++(int).
// Выборка, затем инкрементирование
const SimpleCircle SimpleCircle::operator++ (int)
{
// объявляем локальный объект класса SimpleCircle и инициализируем его значением
*this
SimpleCircle temp(<
++(*itsRadius);
return temp;
}
6. Создайте в классе SimpleCircle конструктор-копировщик.
SimpleCircle::SimpleCircle(const SimpleCircle & rhs)
{
int val = rhs.GetRadius();
itsRadius = new int(val);
}
7. Перегрузите в классе SimpleCircle оператор присваивания.
SimpleCircle& SimpleCircle::operator=(const SimpleCircle & rhs)
{
if (this == &rhs)
return *tnis;
delete itsRadius;
itsRadius = new int;
*itsRadius = rhs.GetRadius();
return *this;
}
8. Напишите программу, которая создает два объекта класса SimpleCircle. Для создания одного объекта используйте конструктор, заданный по умолчанию, а второму экземпляру при объявлении присвойте значение 9. С каждым из объектов используйте оператор инкремента и выведите полученные значения на печать. Наконец, присвойте значение одного объекта другому объекту и выведите результат на печать.
#include
class SimpleCircle
{
public:
// конструкторы
SimpleCircle();
SimpleCircle(int);
SimpleCircle(const SimpleCircle &);
~SimpleCircle() {}
// методы доступа к данным
void SetRadius(int);
int GetRadius() const;
// операторы
const SimpleCircle& operator++();
const SimpleCircle operator++(int);
SimpleCircle& operator=(const SimpleCircle &):
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 <
*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() << 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:
// ...
virtual Square * clone() const { return new Square(*this); }
// ...
};
5. Жучки: что неправильно в следующем программном коде?
Читать дальшеИнтервал:
Закладка: