1. Напишите программу, которая объявляет переменную типа int, ссылку на значение типа int и указатель на значение типа int. Используйте указатель и ссылку для управления значением переменной типа int.
2. Напишите программу, которая объявляет константный указатель на постоянное целое значение. Инициализируйте этот указатель, чтобы он указывал на целочисленную переменную varOne. Присвойте переменной varOne значение 6. Используйте указатель, чтобы присвоить переменной varOne значение 7. Создайте вторую целочисленную переменную varTwo. Переназначьте указатель, чтобы он указывал на переменную varTwo. Пока не компилируйте это упражнение.
3. Скомпилируйте программу, написанную в упражнении 2. Какие действия компилятор считает ошибочными? Какие строки генерируют предупреждения?
4. Напишите программу, которая создает блуждающий указатель.
5. Исправьте программу из упражнения 4, чтобы блуждающий указатель стал нулевым.
6. Напишите программу, которая приводит к утечке памяти.
7. Исправьте программу из упражнения 6.
8. Жучки: что неправильно в этой программе?
1: #include
2:
3: class CAT
4: {
5: public:
6: CAT(int age) { itsAge = age; }
7: ~CAT{ }
8: int GetAge const { return itsAge;}
9: private:
10: int itsAge;
11: };
12:
13: CAT & MakeCat(int age);
14: int main
15: {
16: int age = 7;
17: CAT Boots = MakeCat(age);
18: cout << "Boots is " << Boots.GetAge << " years old!\n";
19: return 0;
20: }
21:
22: CAT & MakeCat(int age)
23: {
24: CAT * pCat = new CAT(age);
25: return *pCat;
26: }
9. Исправьте программу из упражнения 8.
День 10-й. Дополнительные возможности использования функции
На занятии 5 вы познакомились с основными принципами использования функций. Теперь, когда вы знаете, как работают указатели и ссылки, перед вами открываются дополнительные возможности. Сегодня вы узнаете:
• Как перегружать функции-члены
• Как перегружать операторы
• Как создавать функции для поддержания классов с динамическим выделением памяти для переменных
Перегруженные функции-члены
На занятии 5 вы получили общие представления о полиморфизме, или перегружаемости функций. Имеется в виду объявление двух или более функций под одним именем но с разными параметрами. Функции-члены класса можно перегружать точно так же.
В классе Rectangle (листинг 10.1) объявляются две функции DrawShape. Первая, которая не содержит списка параметров, вычерчивает прямоугольник, основываясь на текущих значениях класса. Вторая принимает два значения — ширину и длину — и в соответствии с ними создает прямоугольник, игнорируя текущие значения класса.
Листинг 10.1. Перегрузка функций-членов
1: //Листинг 10.1. Перегрузка функций-членов
2: #include
3:
4: int
5: // Обьявление класса Rectangle
6: class Rectangle
7: {
8: public:
9: // конструкторы
10: Rectangle(int width, int height);
11: ~Rectangle{ }
12:
13: // перегрузка функции-члена класса DrawShape
14: void OrawShape const;
15: void DrawShape(int aWidth, int aHeight) const;
16:
17: private:
18: int itsWidth;
19: int itsHeight;
20: };
21:
22: // Применение конструктора
23: Rectangle::Rectangle(int width, int height)
24: {
25: itsWidth = width;
26: itsHeight = height;
27: }
28:
29:
30: // Перегруженная функция DrawShape - вариант без передачи данных
31: // Создание прямоугольника по значениям, заданным по умолчанию
32: void Rectangle::DrawShape const
33: {
34: DrawShape( itsWidth, itsHeight);
35: }
36:
37:
38: // Перегруженная функция DrawShape - передача двух значений
39: // Создание прямоугольника по значениям, переданным с параметрами
40: void Rectangle:;DrawShape(int width, int height) const
41: {