hkjCJgcQqF
.pdf{
if (area_<0) // Если пока что не вычислено
{
CalcArea(); // Вычисляем
}
return area_;
}
private:
void InvalidateArea () { area_ = -1; } void CalcArea ()
{
area_=0; vector<Point>::iterator i;
for (i=points_.begin(); i!=points_.end(); ++i ) area_+= /* некоторое вычисление */;
} |
|
vector<Point> points_; |
|
double area_; |
|
}; |
|
Polygon operator+(Polygon lhs, |
Polygon rhs ) |
{ |
|
Polygon ret= lhs; |
|
int last = rhs.GetNumPoints(); |
|
for (int i=0; i< last; ++i ) |
// конкатенация |
{
ret.AddPoint ( rhs.GetPoint( i ) );
}
return ret;
}
void f ( const Polygon & poly )
{
const_cast<Polygon &>(poly).AddPoint (Point (0, 0) );
}
void g (Polygon & const rPoly )
{rPoly.AddPoint (Point (1, 1 ) ); } void h (Polygon * const rPolt )
{rPoly->addPoint (Point ( 2, 2 ) ); }
int main ( ) |
{ |
Polygon |
poly; |
const Polygon cpoly; f(poly);
f(cpoly);
g(poly);
123
h(&poly); |
} |
|
|
2. Приведите |
возможные |
последовательности |
определенных |
пользователем пребразований для следующих инициализаций? class LongDouble {
operator double (); operator float (); };
extern LongDouble ldObj;
(a)int ex1 = ldObj;
(b)float ex2 = ldObj;
Шаблоны функций
1. Пусть дано следующее определение шаблона функции sum( ): template <class T1, class T2, class T3>
T1 sum (T2, T3 );
Какие из приведенных ниже вызовов ошибочны? Почему? double dobj1, dobj2;
float fobj1, fobj2; char cobj1, cobj2;
(a)sum (dobj1, dobj2 );
(b)sum<double, double, double> (fobj1, fobj2 );
(c)sum<int> (cobj1 , cobj2 );
(d)sum<double, , double> ( fobj2, dobj2 );
2.Пусть дано следующее определение шаблона функции sum(): template <typename Type>
Type sum( Type op1, char op2 );
Как написать явное объявление конкретизации этого щаблона с аргументом типа string?
3. Имеются следующие объявления функций:
template <typename T1, typename T2> void g(T1, T2); //(1)
template <typename T> void g ( T ); |
//(2) |
template <typename T> void g (T, T ); |
//(3) |
template <typename T> void g (T* ); |
//(4) |
template <typename T> void g (T*, T); |
//(5) |
template <typename T> void g (T , T* ); |
//(6) |
template <typename T> void g ( int , T* ); |
//(7) |
template <> void g<int>( int ); |
//(8) |
void g (int , double ); |
//(9) |
void g( int ); |
//(10) |
Какие из этих функций будут вызваны в каждой из следующих инструкций? Где это возможно, укажите типы параметров шаблонов.
int i; double float
124
complex<double> c;
g ( i ); |
(a) |
g <int>( i ); |
(b) |
g ( i, i ); |
(c) |
g ( c ); |
(d) |
g ( i, f ); |
(e) |
g ( i, d ); |
(f) |
g (c, &c ); |
(g) |
g (i, &d ); |
(h) |
g (&d, d ); |
(i) |
g ( &d ); |
(j) |
g (d, &i ); |
(k) |
g (&i, &i ); |
(l) |
4. Рассмотрите следующий код: template<typename T> void f (T& t)
{
typename T::value_type* p1 = &t[0]; typename T::value_type* p2 = &*t.begin(); // работаем с *p1 и *p2
}
Корректен ли данный код?
5. Что такое typename и что делает это ключевое слово?
125
Заключение
Первая часть данного пособия позволяет освоить курс программирования на С++ на основе объектно-ориентированной методологии. Центральным элементом ООП является инкапсуляция соответствующего множества типов данных и действий над ними. Пособие может успешно применяться в качестве дополнительной литературы в курсе по структурам данных.
Литература
Основная
1.Бьерн Страуструп. Программирование: принципы и практика использования C++.Издание третье исправленное. Пер. с англ. Изд. Вильямс2011г. -1248стр., с ил., ISBN: 978-5-8459
2.Герберт Шилдт. C++: базовый курс. изд. Вильямс. 3-е издание Пер. с англ.-2010г.-624с., ил. ISBN 978-5-8459-0768-4
3.Герберт Шилдт. Полный справочник по С++, 4-изд.: Пер. с англ.-М- издательский дом “Вильямс”, 2004.-800 с.:ил.ISBN 5-8459-0489-7
4.Р.Лафоре. Объектно-ориентированное программирование в С++. Издательство: Питер, Пер. с англ. 2011г. -923с., ил. ISBN 978-5-4237-0038-
5.Лажойе Ж. Липпман С. Весь С++. От азов до совершенства. ДМК Пресс Невский диалект. Пер.с англ. 2007. 1104 с., ил. ISBN 5-94074-367-6, 5- 7940-0070-8, 0-201-82470-1
6.Стенли Б. Липпман , Жози Лажойе , Барбара Му. Язык программирования С++. Вводный курс.Изд.Вильямс, 2007. -896с., ил. ISBN 5-8459-1121-4б 0-201-72148-1.
7.Стенли Б. Липпман , Жози Лажойе. Язык программирования С++. Вводный курс. Издательства: Невский Диалект, ДМК Пресс, Пер.с англ. 2001г. -1104с., ISBN 5-7940-0070-8, 5-94074-040-5.
8.Дэвид Вандевурд , Николаи М. Джосаттис. Шаблоны C++: справочник разработчика. : Пер. с англ. — М. : Издательский дом "Вильяме", 2003. —
544с.: ил. ISBN 5-8459-0513-3 (рус.)
Дополнительная
1.Роберт Седжвик. Алгоритмы на С++. Издательство :Вильямс. Пер. с англ.- 2011-1056с., ил. ISBN 978-5-8459-16650-1.
2.Герб Саттер. Новые сложные задачи на C++: 40 новых головоломных примеров с решениями. изд. Вильямс.-2008.-272с., ил. ISBN 5-8459-0823-1
126
Содержание |
|
Введение |
6 |
Глава 1. Классы и объекты |
9 |
Конструкторы и деструкторы |
10 |
Объявление объекта |
11 |
Реализация класса |
12 |
Реализация конструктора |
12 |
Создание объектов |
13 |
Объекты и передача информации |
13 |
Указатель this |
14 |
Массивы объектов |
16 |
Множественные конструкторы |
16 |
Конструкторы с одним параметром |
19 |
Статические члены класса |
19 |
Статические функции-члены |
21 |
Дружественные функции |
22 |
Дружественные классы |
23 |
Лабораторная работа № 1-а Тема: Создание классов. |
24 |
Контрольные вопросы |
31 |
Лабораторная работа № 1-б Тема: Объекты и классы языка С++ |
32 |
Контрольные вопросы |
33 |
Задание для самостоятельной работы Тема: Создание и использование |
|
классов |
33 |
Контрольные вопросы |
38 |
Глава 2. Перегруженные функции |
39 |
Перегрузка и область видимости |
40 |
Указатели на перегруженные функции |
41 |
Шаги разрешения перегрузки |
41 |
Преобразования типов аргументов |
43 |
Стандартное преобразование |
45 |
Ссылки |
47 |
Аргументы со значениями по умолчанию |
49 |
127 |
|
Лабораторная работа № 2 Тема: Перегруженные функции |
50 |
Задание для самостоятельной работы |
55 |
Глава 3. Перегрузка операторов и преобразования, определенные |
|
пользователем |
56 |
Операторные функции |
66 |
Друзья |
68 |
Оператор взятия индекса |
72 |
Оператор вызова функции |
73 |
Оператор “стрелка” |
74 |
Создание префиксной и постфиксной форм операторов |
|
инкрементации и декрементации |
76 |
Перегрузка операторов new и delete |
76 |
Перегрузка оператора “,” |
78 |
Определяемые пользователем преобразования |
79 |
Конвертеры |
81 |
Конструктор как конвертер |
85 |
Выбор преобразования |
87 |
Лабораторная работа № 3 Тема: Перегруженные операторы |
90 |
Задание для самостоятельной работы |
101 |
Глава 4. Шаблоны функций |
103 |
Обобщенные функции |
103 |
Инстанцирование |
104 |
Параметры шаблонов |
109 |
Явное задание аргументов шаблона |
111 |
Явная специализация шаблона |
111 |
Лабораторная работа № 4 Тема: Шаблоны функций в языке С++ |
114 |
Задание для самостоятельной работы |
117 |
Тестовое задание |
118 |
Классы и объекты |
118 |
Перегруженные функции |
121 |
Перегрузка операторов и преобразования, определенные |
|
пользователем |
122 |
128
Шаблоны функций |
124 |
Заключение |
126 |
Литература |
126 |
Содержание |
124 |
129
Яковлева Людмила Владимировна
Практикум по объектно-ориентированному программированию в С++
Учебно-методическое пособие
Часть 1
Науч. ред. Б.М. Верещагин
Подписано в печать 31.03.2011 г. Формат 60×90/16. Усл. печ. л. 7,8. Тираж 50 экз.
Отпечатано в редакционно-издательском отделе (РИО) МГГУ.
Мурманский государственный гуманитарный университет. 183720, г. Мурманск, ул. Капитана Егорова, 15.
130
131