Вы находитесь на странице: 1из 51

Учреждение образования

«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ»

Н. В. Пацей

Объектно‐ориентированное 
программированиена С++/C# 
Лабораторный практикумпо одноименной дисциплине
для студентов специальности 1-40 01 02-03
«Информационные системы и технологии
(издательско-полиграфический комплекс)»

В 2-х частях

Часть 1 

Минск 2014
     

1
УДК 004.4(076.5)
ББК 22.18я7
П21

Рассмотрен и рекомендован редакционно-издательскимсоветом


Белорусского государственного технологического университета

Рецензенты:
кандидат технических наук,доцент кафедрысистем
автоматизированногопроектированияБНТУ В. Т. Придухо;
кандидат технических наук,доцент кафедрыавтоматизации
производственных процессов иэлектротехники БГТУД. А. Гринюк

Пацей, Н. В.
П21 Объектно-ориентированное программирование на С++/C# :
лаб. практикум по одноименной дисциплине для студентовспеци-
альности 1-40 01 02-03 «Информационные системы и технологии
(издательско-полиграфичкеский комплекс)».В 2 ч. Ч. 1/ Н. В. Па-
цей. – Минск: БГТУ, 2014. – 70 с.
Приведены вопросы для самоконтроля, описаны задания с пояснениями по
11 темам в соответствии с рабочей программой дисциплины «Объектно-ориентиро-
ваное программирование», по темам классы, наследование, перегрузка, шаблоны и
STL предлагаются по 10 вариантов заданий для индивидуального выполнения.
Предназначен для студентов специальности 1-40 01 02 (1-40 01 02-03) «Ин-
формационные системы и технологии (издательско-полиграфический комплекс)»,
1-98 01 03 «Программное обеспечение информационной безопасности мобильных
систем», 1-40 01 01 «Программное обеспечение информационных технологий».

УДК004.4(076.5)
ББК 22.18я7

 УО «Белорусский государственный
технологический университет», 2014
 Пацей Н. В., 2014

2
ПРЕДИСЛОВИЕ 
 
Дисциплина «Объектно-ориентированное программирование» яв-
ляется базовым курсом, обеспечивающим подготовку студента
к освоению современных технологий разработки программного обес-
печения.
Средствами изучения являются языки программирования C++ и
С#, представляющие наиболее полный набор инструментов, необхо-
димых для практического освоения современных методов программ-
ной реализации алгоритмов.
Цель курса –подготовка специалиста, владеющего фундаменталь-
ными знаниями и практическими навыками в области объектно-
ориентированного программирования и элементов проектирования.
Основные задачи курса – изучение принципов ООП, приобрете-
ние практических навыков в использовании объектно-
ориентированных инструментов программирования, а также знаком-
ство с классами, широко используемыми при создании прикладных
программ.
Лабораторный практикум расчитан на 28 часов аудиторных заня-
тий по десяти темам. Для самостоятельного выполенения работ необ-
ходимо предварительно ознакомиться c теоретическим материалом
[1], пройти тест в соответсвии с приведенными в темах вопросами.
Студент должен владеть алгоритмизацией инженерных задач,
уметь использовать средства отладки и тестирования программ; знать
программирование на языкеС++, основы модульного проектирования
программ,способы управления динамической памятью,структуры
данных и алгоритмы их обработки.

3
ТЕМА 1. КЛАССЫ И ОБЪЕКТЫ 
 
Изучите теоретический материал учебно-методического пособия
[1].Ответьте на вопросы. Выполните самостоятельно задание в соот-
ветствии с вариантом.

Вопросы 
1. Какие ключевые слова можно использовать при определении
класса?
2. В чем отличие между объектом и классом?
3. Что такое конструктор?
4. Что такое деструктор (destructor)?
5. Что такое дружественная функция(friendfunction)?
6. Что такое копирующий конструктор (сору constructor)?
7. Дополните фразу «…является специальной функцией-членом,
используемой для задания начальных значений данным, членам
класса».
8. Продолжите фразу «По умолчанию доступ к членам класса…».
9. Продолжите фразу «Говорят, что реализация класса скрыта от
его клиентов или …».
10. Дополните фразу «Набор открытых функций-членов класса
рассматривается как … класса».
11. Продолжите фразу «В определении класса члены класса
с ключевым словом private доступны …».
12. Напишите определение класса SS, включающего одно закры-
тое поле типа int с именем bar и одним открытым методом с прото-
типом voidPrint().
13. Истинно ли следующее утверждение: поля класса должны
быть закрытыми?
14. Продолжите фразу «операция точки (операция доступа к члену
класса) объединяет следующие два элемента (слева направо)…».
15. Конструктор вызывается автоматически в момент …объекта.
16. Верно ли следующее утверждение: класс может иметь более
одного конструктора с одним и тем же именем?
17. Найдите ошибку и объясните, как ее исправить. Допустим, что
в классе Time объявлен следующий прототип:
void ~Time( int ) 

4
18. Функция, не являющаяся членом, которая должна иметь до-
ступ к закрытым данным-членам класса, должна быть объявлена как
… этого класса.
19. Определите класс CBOX, объявите массив объектов CBOX.
20. Определите класс CBOX, объявите статический член класса int.
Выполните его инициализацию. Сколько экземпляров статического
данного будет существовать, если число объектов класса равно 5.
21. Пусть есть класс:
class   list 
      {// ... 
staticvoid    show(); 
// Статическаяфункцияпросмотраспискаобъектов 
}                  
staticvoid    list::show() 
  { 
list    *p; 
for (p=fst; p !=NULL; p=p‐>next) 
//  { ...вывод информации об объекте... } 
  } 
Создайте объект класса и вызовите функцию show.
22. Пусть есть класс DATE. Запишите возможные способы создания
объектов класса. Когда будет вызываться конструктор копирования?
23. Что такое вложенные классы? Приведите пример.
24. В чем разница между X x; и X x();?
25. Что будет выведено на экран?
#include<iostream> 
class A 

public: 
A(void){this‐>_num=0;} 
int A(intnum){this‐>_num=num;} 
    ~A(void){std::cout<<this‐>_num;} 
private: 
int _num;  
}; 
int main(void) 

    A val(100); 
return 0; 

26. Скомпилируется ли следующий код:

5
classClazz 

}; 
 

27. Каким будет результат выполнения следующего кода:


class Counter { 
public: 
void Count() { printf("%d", 1); } 
}; 
 
int main() { 
  Counter obj; 
obj.Count(); 
return 0; 

 
void Counter::Count() { printf("%d", 2); } 

Задачи для самостоятельного решения 
Общее задание. Определить пользовательский класс в соответ-
ствии с вариантом задания (см. варианты). Добавить в класс следую-
щие конструкторы: без параметров, с параметрами, копирования.
Определить в классе деструктор, компоненты-функции для просмотра
и установки полей данных. Написать демонстрационную программу,
в которой создаются и разрушаются объекты пользовательского клас-
са и каждый вызов конструктора и деструктора сопровождается выда-
чей соответствующего сообщения (какой объект какой конструктор
или деструктор вызвал). При работе с классами пользоваться
Class Wizard.

6
Индивидуальное задание(по вариантам)

Вариант Задание
Создать класс employee. Класс должен включать поле типа
intдля хранения номера сотрудника и поле типа float для
хранения величины его оклада. Методы класса должны
1 позволять пользователю вводить и отображать данные
класса. Написать функцию main(), которая запросит поль-
зователя ввести данные для трех сотрудников и выведет
полученную информацию на экран
Создать класс Int, имитирующий стандартный тип int.
Единственное поле этого класса должно иметь тип int.
Создать методы, которые будут устанавливать значение
поля равным нулю, инициализировать его целым значени-
ем, выводить значение поля на экран и складывать два
2
значения типа Int.
Написать программу, в которой будут созданы три объек-
та класса Int, два из которых – инициализированы. Сло-
жить два инициализированных объекта, присвоить ре-
зультат третьему, а затем отобразить результат на экране
Создать класс типа двухсвязный список. Поля-данные:
указатель на область памяти типа void, указатели на сле-
дующий и предыдущий. Функции-члены добавляют эле-
3
мент к списку, удаляют элемент из списка, выводят эле-
менты списка от начала и от конца, ищут заданный эле-
мент в списке
Создать класс типа дата с полями: день (1–31), месяц
(1–12), год (целое число). Класс имеет конструктор.
Функции-члены установки дня, месяца и года, функ-
ции-члены получения дня, месяца и года, а также две
4
функции-члены печати: печать по шаблону «5 января
1997 года» и«05.01.1997». Функции-члены установки
полей класса должны проверять корректность задава-
емых параметров
Создать класс типа прямоугольник. Поля – высота и ши-
рина. Функции-члены вычисляют площадь, периметр,
5 устанавливают поля и возвращают значения. Функции-
члены установки полей класса должны проверять кор-
ректность задаваемых параметров. Функцияпечати

7
Вариант Задание
Создать класс типа круг. Поля-данные: радиус, координа-
ты центра. Функции-члены вычисляют площадь, длину
окружности, устанавливают поля и возвращают значения.
6
Функции-члены установки полей класса должны прове-
рять корректность задаваемых параметров (не равны нулю
и не отрицательные). Функцияпечати
Создать класс множествоSet. Функции-члены реализуют
7 добавление и удаление элемента, пересечение и разность
множеств
Создать класс типа квадрат. Поля-данные: сторона. Функ-
ции-члены вычисляют площадь, периметр, устанавливают
8 поля и возвращают значения. Функции-члены установки
полей класса должны проверять корректность задаваемых
параметров. Функцияпечати
Создать класс типа время с полями: час (0–23), минуты
(0–59), секунды (0–59). Класс имеет конструктор. Функ-
ции-члены установки времени, получения часа, минуты и
9 секунды, а также две функции-члены печати: печать по
шаблону «16 часов 18 минут 3 секунды» и «4 p.m. 18 ми-
нут 3 секунды». Функции-члены установки полей класса
должны проверять корректность задаваемых параметров
Создать класс одномерный массив целых чисел (вектор)
с полями – количество фактических элементов, массив
(динамический). Функции-члены: обращения к отдельно-
10
му элементу массива, вывода массива на экран, поэле-
ментного сложения и вычитания со скаляром, вывода эле-
мента по заданному индексу

8
ТЕМА 2. НАСЛЕДОВАНИЕ 
 
Изучите теоретический материал [1].Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Вопросы 

1. Что такое производный и базовый классы?


2. В чем заключена основная задача наследования?
3. Пусть базовый класс содержит метод basefunc(), а производ-
ный класс не имеет метода с таким именем. Может ли объект произ-
водного класса иметь доступ к методу basefunc()? Если да, то при
каких условиях?
4. Напишите первую строку описания класса B, который является
public-производным класса A.
5. Допустим, что базовый и производный классы включают в себя
методы с одинаковыми именами. Какой из методов будет вызван объ-
ектом производного класса, если не использована операция разреше-
ния имени?
6. Напишите объявление конструктора без аргументов для произ-
водного класса B, который будет вызывать конструктор без аргумен-
тов класса A.
7. Предположим, что существует класс D, производный от базово-
го класса B. Напишите объявление конструктора производного класса,
принимающего один аргумент и передающего его в конструктор базо-
вого класса.
8. Истинно ли следующее утверждение: класс D может быть про-
изводным класса С, который, в свою очередь, является производным
класса В, производногоот класса А?
9. Напишите первую строку описания класса Petrov, который яв-
ляется public-производным классов Homo и Worker.
10. Дополните фразу «C++ обеспечивает …, которое позволяет
производному классу наследовать несколько базовых классов, даже
если эти базовые классы неродственные».
11. Истинно ли утверждение о том, что указатель на базовый
класс может ссылаться на объекты порожденного класса.
12. Можно ли использовать объект базового класса в производном
классе в явном виде?

9
13. Пусть classB : A { }. Куда перейдет public-часть класса A?
14. Пустьclass  B  :  public  A  {  }. Куда перейдет public-часть
класса A?
15. Что такое единичное и множественное наследование?
16. Что такое полиморфизм?
17. Определите назначение виртуальных функций.
18. Определите класс с виртуальной функцией.
19. Что будет выведено на экран в результате выполнения следу-
ющего кода:
classABase { 
public: 
void f(inti) const { cout<< 1;} 
void f(charch) const { cout<< 2; } 
}; 
 
classBBase { 
public: 
void f(double d) const { cout<< 3;} 
}; 
 
classABBase : publicABase, publicBBase { 
public: 
usingABase::f; 
usingBBase::f;         
void f(charch) const { cout<< 4; } 
}; 
 
void g(ABBase&ab) { 
ab.f('c'); 
ab.f(2.5); 
ab.f(4); 

 
int main() { 
ABBaseab; 
g(ab); 

 

20. Что будет выведено в консоль при попытке выполнить следу-


ющую программу:
class A { 
int j; 
public: 

10
A(inti) : j(i) { } 
 
void print() 
  { 
cout<<sizeof(j) <<endl; 
  } 
}; 
 
class B : virtualpublic A { 
public: 
B(inti) : A(i) { } 
}; 
 
class C : public B { 
public: 
C(inti) : B(i) { } 
}; 
 
int main(intargn, char * argv[]) 

  C c(1); 
c.print(); 
return 0; 

21. В каких из перечисленных строк произойдут ошибки компиля-
ции:
class Base { 
public: 
void method1(); 
protected: 
void method2(); 
private: 
void method3(); 
}; 
 
class Child : public Base { 
protected: 
void method1() { } 
void method2() { } 
void method3() { } 
}; 
 

int main() {  
    Base* base = newChild(); 
base‐>method1();         // 1 
base‐>method2();         // 2 

11
base‐>method3();         // 3 
return 0;  

22. Что выведет следующая программа:
 

class A 

public: 
A() { f(); } 
virtualvoid f() 
    { 
std::cout<<"A::f"; 
    } 
}; 
class B : public A 

public: 
void f() 
    { 
std::cout<<"B::f"; 
    } 
}; 
 
int main(intargc, char * argv[]) 

    A * a = newB(); 
delete a; 
return 0; 

23. Чем можно заменить строку // 1 чтобы программа скомпили-
ровалась?
class A 

public: 
voidsomeMethod() { /* ... */ } 
}; 
 
class B : public A  

public: 
voidsomeMethod(intsomeArg) { /* ... */ }// 1 
}; 
 
int main(intargc, char* argv[]) 

12

  B b; 
b.someMethod(); 
return 0; 

24. Что напечатает следующий код при создании экземпляра
класса X:
classY { 
public: 
Y() { cout<<"Y"; } 
}; 
classZ { 
public: 
Z() { cout<<"Z"; } 
}; 
classX : publicZ { 
private: 
Ym_objY; 
public: 
X() { cout<<"X"; } 
};  
25. В какой последовательности вызовутся деструкторы?
class A { 
public: 
    A () {} 
    ~A() { cout<<"~A";} 
}; 
 
class B : public A { 
public: 
    B () {} 
    ~B () { cout<<"~B"; } 
}; 
 
int main () { 
    A *b = new B (); 
delete b; 
return 0; 

 

26. Что выведет следующий код:


 

struct A { A() { cout<<"A"; } }; 
struct B : A { B() { cout<<"B"; } }; 

13
struct C : A { C() { cout<<"C"; } }; 
struct D : B, C { D() { cout<<"D"; } }; 
 

intmain() { 
Dd; 

Задачи для самостоятельного решения 

Общее задание.Определить иерархию классов (в соответствии с


вариантом – выделить базовый и производные). Реализовать классы
(самостоятельно задать члены-данные и методы класса). Написать де-
монстрационную программу, в которой создаются объекты различных
классов. Определение классов (*.h), их реализацию (*.cpp), демон-
страционную программу (*.cpp) поместить в отдельные модули.
Далее приведен перечень классов.

Индивидуальное задание(по вариантам)


Вариант Задание
Классы – человек (имя, дата рождения), абитуриент (ко-
1 личество баллов), студент (курс, группа, факультет), пре-
подаватель (должность, кафедра)
Классы –растение (название, вид), дерево (возраст), цве-
2
ток (длина стебля), роза (цвет)
Классы – кадры (имя), рабочий (специальность, цех), инже-
3 нер (квалификация, подразделение), администрация (долж-
ность)
Классы – БГТУ (адрес), факультет (название), группа (номер,
4
староста, курс), подгруппа (номер, количество студентов)
Классы – печатное издание (издательство, год, название),
5 журнал (номер, месяц), книга (тематика, автор, количество
страниц), учебник (назначение)
Классы –млекопитающие (год), парнокопытные (среда
6
обитания), птицы (хищники), животное (вид, род, вес)
Классы – место (площадь, название), область (количество
7 населенных пунктов, руководство), город (область, коли-
чество жителей, мэр), деревня (район)
Классы – товар (название), радиотовары (назначение),
8 продукт (отдел), молочный продукт (разновидность, дата
изготовления), транзистор (тип, номер)

14
Вариант Задание
Классы – автомобиль (марка, номер), поезд (номер, коли-
чество вагонов, количество пассажиров в вагоне), транс-
9
портное средство (средняя скорость, вид топлива, год вы-
пуска)
Классы – республика (вид, правительство), монархия (вид,
10 имя монарха), королевство (король), государство (назва-
ние, денежная единица, символика)

15
ТЕМА 3. АБСТРАКТНЫЕ КЛАССЫ 
 
Изучите теоретический материал [1].Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Вопросы 

1. Что такое чистая виртуальная функция? Приведите пример.


2. Напишите объявление чистой виртуальной функции Fun, не
возвращающей значений и не имеющей аргументов.
3. Что такое абстрактный класс? Приведите пример.
4. Можно ли создать объект абстрактного класса?
5. Напишите объявление виртуальной функции Fun(), возвраща-
ющей результат типа int и имеющей аргумент типа int.
6. Дополните фразу «Пусть указатель р ссылается на объекты базо-
вого класса и содержит адрес объекта порожденного класса. Пусть в
обоих этих классах имеется виртуальный методFun(). Тогда выражение
p ‐>Fun(); поставит на выполнение версию функции Fun() из … клас-
са».
7. Определите в произвольном классе статическую функцию. Ка-
ково ее назначение?
8. Как вызвать статическую функцию?
9. Как называется вызов функции, обрабатываемый во время вы-
полнения программы?
10. В каких строках будут ошибки при компиляции данного кода:
class Test 

public: 
bool flag; 
    Test () { flag = false; } 
staticintObjectCount;   // 1 
staticvoidPOut ()     // 2 
    { 
cout<< flag;     // 3 
cout<<ObjectCount;   // 4 
    } 
}; 
 
int Test::ObjectCount = 0;     // 5 
 

16
int main () 

    Test T; 

11. Чтовыведетследующийкодприсозданииэкземпляракласса D:
struct A { A() { cout<<"A"; } }; 
struct B : virtual A { B() { cout<<"B"; } }; 
struct C : virtual A { C() { cout<<"C"; } }; 
struct D : B, C { D() { cout<<"D"; } }; 
12. Что произойдет при компиляции и выполнении кода:
 

class A { 
public: 
A() { f("A()"); } 
    ~A() { f("~A()"); } 
protected: 
virtualvoid f(constchar* str) = 0; 
}; 
 
class B : public A { 
public: 
B() { f("B()"); } 
    ~B() { f("~B()"); } 
protected: 
void f(constchar* str) { cout<<str<<endl; } 
}; 
intmain() { 
Bb; 
return 0; 

13. Допустимо ли в С++ определение следующего чисто вирту-
ального метода:
classAbstract 

public: 
virtualvoidpureVirtual() = 0 { 
// реализация 
   } 
}; 
14. Корректно ли описание метода modify в составе класса Test?
class Test { 
private: 

17
mutableintmX; 
public: 
void modify( constintiNewX ) const  { 
mX = iNewX; 
   } 
}; 

Задачи для самостоятельного решения 

Общее задание.Расширить иерархию классов с использованием


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

Пример:
//абстактный базовый класс
classPerson 

protected: 
            … 
static Person *head; 
public: 
         Person *next; 
         … 
virtual ~Person(){} 
         … 
virtualchar* getName() const = 0; 
virtualvoid setName(constchar *name_) = 0; 
virtualint getAge() const = 0; 
virtualvoid setAge(constint age_) = 0; 
};   
             //наследование 
class Employee : public Person  

protected: 

18
…     
public: 
      … 
      virtualchar* getName() const; 
virtualvoid setName(constchar *name_); 
virtualint getAge() const; 
virtualvoid setAge(constint age_); 
      … 
friend ostream&operator<<(ostream& out, Employee& e); 
… 
staticvoidshow(); 
…       //статический метод просмотра 
void Employee::show() 

     Person *p = head; 
while(p) 
          { 
           … 
           p = p ‐> next; 


…       //инициализация статической компоненты 
Person * Person::head = NULL; 
int _tmain(int argc, _TCHAR* argv[]) 

19
ТЕМА 4. ДИНАМИЧЕCКАЯ ИДЕНТИФИКАЦИЯ 
ТИПОВ 
 
Изучите теоретический материал [1].Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Задачи для самостоятельного решения 

Общее задание. Использовать проект, созданный в практикуме


№ 3.Определить методы-итераторы в неабстрактных классах на осно-
ве приведенных в вариантах запросов.

Индивидуальное задание(по вариантам)


Вариант Задание
Запросы – имена студентов указанного курса, имена
1
и должность преподавателей указанной кафедры
Запросы – все чайные розы с длиной стебля большей, чем
2
задал пользователь, количество роз заданного цвета
Запросы – имена рабочих заданного цеха, количество ин-
3
женеров в заданном подразделении
Запросы –количество групп заданного курса, старост всех
4
групп опредленного факультета
Запросы –наименования всех книг в библиотеке (мага-
5 зине), вышедших не ранее указанного года; суммарное
количество учебников в библиотеке (магазине)
Запросы –средний вес животных заданного вида в зоо-
6
парке, количество хищных птиц
Запросы –названия всех городов заданной области, сум-
7
марное количество жителей всех городов в области
Запросы –наименования всех товаров в заданном отделе
8 магазина, суммарная стоимость товара заданного наиме-
нования
Запросы –количество указанных транспортных средств
9 в автопарке (на автостоянке), количество мест во всех ва-
гонах поездов
Запросы –имена всех монархов на заданном континенте,
10
количество демократических государств

20
Пример:

// метод‐ итератор   ‐     найти все узлы заданного номера 

void Uzel::get(int data) 

      Mech* h=head;//  список 
      while (h!=NULL) //цикл 
            { 
             if (h‐>getid()==typeid(Uzel).name())   
        //найти только узлы 
                  { 
                        if (h‐
>nomber==data) //сравнить числа 
                        { 
                             h‐>print();  
          // вывести как найденнный 
                        } 
                  } 
                  h=h‐>next;   // на след 
            }; 

21
ТЕМА 5. ПЕРЕГРУЗКА ОПЕРАЦИЙ 
 
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Вопросы 

1. Каково назначение перегрузки операторов?


2. Как используется ключевое слово operator?
3. Можно ли перегрузкой отменить очередность выполнения опе-
рации?
4. Истинно ли следующее утверждение: операция >= может быть
перегружена?
5. Сколько аргументов требуется для определения перегруженной
унарной операции?
6. Если перегрузить операцию арифметического присваивания,
куда передастся результат?
7. Истинно ли следующее утверждение: выражение objA=objB бу-
дет причиной ошибки компилятора, если объекты разных типов?
8. Можно ли перегрузкой отменить число операндов?
9. Какие операции требуют, чтобы левый операнд был объектом
класса?
10. Какие операторы нельзя перегружать?
11. Запишите приведенный ниже пример как дружественный опе-
ратор класса dat:
 
datdat::operator+(int n)  

  dat     x; 
  x   = *this;                   
  while (n‐‐ != 0) x.next();    
  return(x);                   

12. Наследуется ли перегрузка операции присваивания?


13. Может ли операция = переопределяться вне области определе-
ния класса?
14. Можно ли использовать операцию =, если она не определена?
15. Можно ли перегружать операцию []с использованием friend-
функции?

22
16. Можно ли перегружать операцию ()с использованием friend-
функции?
17. Можно ли перегружать операцию ‐> с использованием friend-
функции?
18. Может ли перегруженная операция delete возвращать значе-
ние void?
19. Может ли перегруженная операция delete возвращать значе-
ние int?
20. Можно ли перегружать операцию delete с использованием
friend-функции?
21. Для чего используется оператор dynamic_cast?
22. Для чего используется оператор const_cast?
23. Для чего используется оператор static_cast?
24. Для чего используется оператор reinterpret_cast?
25. Как называется вызов функции, обрабатываемый во время вы-
полнения программы?
26. Что будет выведено на экран?
 

class А { 
public: 
А(){ }; 
   ~А(){ };  
еxрliсit А(int а); 
ореrаtоrint(){rеturn 1;}      
}; 
 
int main(intargc, char* argv[]) 

   A foo; 
int value = fоо + 1; 
std::cout<< value <<std::endl; 
return 0; 

27. Как реализовать перегрузку инкремента и декремента
в постфиксной и префиксной формах?

Задачи для самостоятельного решения 
Общее задание.Создать заданный в варианте класс. Определить в
классе конструкторы, деструктор, необходимые функции и заданные
перегруженные операции. Написать программу тестирования, в кото-
рой проверяется использование всех перегруженных операций.

23
Индивидуальноезадание(по вариантам)

Вариант Задание
Класс – одномерный массив. Дополнительно перегрузить
следующие операции: * – умножение массивов;  [] – до-
1
ступ по индексу, int() – размер массива; == – проверка на
равенство; <= – сравнение
Класс – одномерный массив. Дополнительно перегрузить
следующие операции: [] – доступ по индексу; == – про-
2
верка на равенство; != – проверка на неравенство; + –
объединение массивов
Класс – множество Сset. Дополнительно перегрузить сле-
дующие операции: + – добавить элемент в множество (ти-
3 па set + item); + – объединение множеств; * – пересечение
множеств,== – проверка множеств на равенство; int  () –
мощность множества
Класс – очередь Сqueue. Дополнительно перегрузить сле-
дующие операции: + – добавить элемент; ‐‐ – извлечь
4 элемент; bool ()  – проверка, пустая ли очередь; < – копи-
рование одной очереди в другую с сортировкой в убы-
вающем порядке; int () – мощность
Класс – множество Сset. Дополнительно перегрузить
следующие операции: () – конструктор множества (в
стиле конструктора для множественного типа); + – объ-
5
единение множеств; <= – сравнение множеств; int()–
мощность множества; []  – доступ к элементу в задан-
ной позиции
Класс – однонаправленный список list. Дополнительно
перегрузить следующие операции: + – объединить два
6
списка; ‐‐ – удалить элемент из начала (‐‐list);== – про-
верка на равенство; bool () – проверка, пустой ли список
Класс – матрица. Дополнительно перегрузить следующие
7 операции: + – сложение матриц; ()  – доступ по индексу
M(с, i); > – сравнение матриц; == – копирование матриц
Класс – время CVector. Дополнительно перегрузить сле-
дующие операции: + – добавление элемента; ++ – увели-
8 чение всех элементов вектора на один (типа СVector++); !=
– проверка на неравенство; []  – доступ к элементу в за-
данной позиции

24
Вариант Задание
Класс – время CVector. Дополнительно перегрузить сле-
дующие операции: ‐ – разность двух векторов; + – сложе-
9
ние элементов вектора с целым; !=– проверка на неравен-
ство; [] – доступ к элементу в заданной позиции
Класс – стек Сstack. Дополнительно перегрузить следую-
щие операции: + – добавить элемент в стек; ‐‐ – извлечь
10 элемент из стека; bool()  – проверка, пустой ли стек; > –
копирование одного стека в другой с сортировкой в воз-
растающем порядке

25
ТЕМА 6. ШАБЛОНЫ КЛАССОВ И ФУНКЦИЙ 
 
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Вопросы 

1. Что такое шаблон?


2. Для чего может быть определен шаблон?
3. Расскажите о назначении шаблонов.
4. Приведите синтаксис объявления шаблона функции.
5. Приведите синтаксис объявления шаблона класса.
6. Может ли быть список параметров шаблона пустым?
7. Есть ли ошибка в определении шаблона:
template<class T, class U>void foo (T*, U); 
8. Может ли быть непараметризовано возвращаемое шаблоном
функции значение? Приведите пример.
9. Можно ли перегружать шаблоны функции?
10. Есть ли ошибка в определении шаблонов:
template<class T>Т min (T* t1, T t2, T t3) 
template<class T>Т min (T t1, int t2) 
11. Для чего используется ключевое слово typename?
12. Запишите шаблон функции сравнения переменных.
13. Запишите шаблон класса массив.
14. Запишите шаблон класса функция.
15. Могут ли использоваться дружественные функции, которые
определены в шаблоне классакак шаблонные?
16. Можно ли определить следующую функцию в шаблоне:
template<class T>class vector  

  virtualvoid   insert(T*); 

17. Можно ли в шаблоне класса определить friend-шаблон клас-
са?
18. Может ли обычный класс содержать шаблонные классы?
19. Могут ли шаблоны быть производными от шаблонов?

26
20. Могут ли шаблоны быть производными от классов?
21. Приведите пример передачи в шаблон класса дополнительных
параметров.
22. Может ли быть параметром шаблона тип данных int?
23. Может ли быть параметром шаблона перечисляемый тип?
24. Может ли обычный класс быть производным от шаблона клас-
са?
25. Что выведет следующий код:
 

class Rose {}; 
 
class A { public: typedef Rose rose; }; 
 
template<typename T> 
class B: public T { public: typedeftypename T::rose 
foo; }; 
 
template<typename T> 
void smell(T) { std::cout<<"Жуть!"<<std::endl; } 
void smell(Rose) { std::cout<<"Прелесть!"<<std::endl; } 
 
int main() 

smell(A::rose()); 
smell(B<A>::foo()); 
return 0; 

 

26. Какие из объявлений шаблона функции верны:


template<class T1, class T2, class T3> 
T3 func(T1, T2) 

... 

 
template<typename T1, typename T2, typename T3> 
T1 func(T3, T2) 

... 

 
template<class T1, T2, class T3> 
T2 func(T1, T3) 

... 

27
template<class T> 
T func(T, T) 

... 

 
template<typename T, typename T> 
T func(T, T) 

... 

 
template<class T, intsz> 
T func(const T (&arr)[sz]) 

... 

Задачи для самостоятельного решения 

Часть 1.
Общее задание. Модифицировать проект, созданный в предыду-
щем задании № 5, следующим образом. Создать шаблон заданного по
варианту класса. Проверить использование шаблона для стандартных
типов данных (int, char или double). Определить пользовательский
класс, который будет использоваться в качестве параметра шаблона.
Для пользовательского типа взять класс из проекта задания№ 1 или
один из № 2 своего варианта (например, реализация шаблона – мно-
жество квадратов). Не забудьте в пользовательском классе перегру-
зить операции, необходимые для работы шаблона.
Часть 2.
Общее задание. Добавить функцию-шаблон в соответствии
с вариантом. Проверить работу шаблон-функции с int, double и поль-
зовательским классом (если имеется несколько полей, для манипуля-
ций выбрать одно из полей класса).

Вариант Задание
Написать функцию-шаблон, вычисляющую среднее
1
значение в массиве
Написать функцию-шаблон поиска минимального зна-
2
чения

28
Вариант Задание
Написать функцию-шаблон удаления каждого второго
3
элемента в множестве
Написать функцию-шаблон поиска максимального эле-
4
мента очереди
Написать функцию-шаблон поиска наиболее близкого
элемента множества к заданно-
5
му.Аргументамифункциидолжныбытьзначение и мно-
жество
Создать шаблон функции прореживания списка. Функ-
6 ция имеет три параметра: откуда выбирать, куда выби-
рать и через сколько выбирать
Создать шаблон функции minmax, которая возвращает
7 сумму минимального и максимального
из значений матрицы
Написать функцию-шаблон, вычисляющую произведе-
8
ние максимального и минимального значения в векторе
Создать шаблон функции, которая возвращает макси-
мально близкое к заданному элементу из значений век-
9
тора. Аргументамифункциидолжныбытьзначение
и вектор
Написать функцию-шаблон, которая подсчитывает ко-
10
личество элементов, больших заданного, в стеке

29
ТЕМА 7. РАБОТА С ПОТОКАМИ, ОБРАБОТКА 
ИСКЛЮЧЕНИЙ 
 
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Вопросы 
1. Дайте определение потока.
2. Назовите три потоковых класса, предназначенных для файлово-
го ввода-вывода.
3. Истинно ли утверждение о том, что некоторые потоки являются
входными, а некоторые –выходными?
4. Напишите выражение, записывающее единичный символ
в объект класса ofstream.
5. Напишите выражение, считывающее содержимое объекта ifile
класса ifstream, в массив buff.
6. Истинно ли утверждение о том, что файловый указатель всегда
содержит адрес файла?
7. Объясните выражение fl.write((char*)&objl,  sizeof(objl)).
Может ли обычный класс быть производным от шаблона класса?
8. Когда происходит исключение?
9. Как сгенерировать исключение?
10. Какого типа может быть аргумент оператора throw?
11. Истинно ли утверждение о том, что выражения, которые могут
создать исключительную ситуацию, должны быть частью блока-
ловушки?
12. Опишите последовательность передачи исключения между
блоками?
13. Можно ли при генерации исключения передать дополнитель-
ную информацию и как?
14. Для чего используется catch?
15. Для чего используется try?
16. Что будет, если заявлено исключение, для которого нет обра-
ботчика в цепочке вызовов?
17. Истинно ли утверждение о том, что программа может про-
должить свое выполнение после возникновения исключительной
ситуации?

30
18. Если в блоке try не генерируются никакие исключения, куда
передается управление после того, как блок try завершит работу?
19. Что произойдет, если исключение будет сгенерировано вне
блока try?
20. Укажите основное достоинство и основной недостаток ис-
пользования catch (...).
21. Что происходит, если несколько обработчиков соответствуют
типу сгенерированного объекта?
22. Какой тип указателя надо использовать в обработчике catch,
чтобы перехватывать любое исключение типа указатель?
23. Может ли обработчик заявить исключение?
24. Приведите пример вложенных исключений.
25. Что такое abort()?
26. Как написать свой обработчик abort?
27. Приведите пример стандартных классов исключений.

Задачи для самостоятельного решения 

Модифицировать проект, созданный в предыдущей задаче № 6.


Реализовать ввод-вывод данных на экран и в файл через потоковые
классы. Например, считать из текстового файла количество и типы со-
здаваемых объектов, а также их значения. Сгенерировать и обработать
как минимум пять различных исключительных ситуаций. Например,
не позволять при инициализации объектов передавать конструкторам
неверные данные, обрабатывать ошибки памяти и ошибки работы с
файлами. Построить иерархию классов исключений.

Пример:
#include<stdlib.h> 
#include<stdio.h> 
#include<conio.h> 
#include<iostream.h> 
#include<fstream.h> 
#include<string.h> 
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐‐ 
// ERRORS 
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐‐ 
class error 

31

char message[80]; 
public: 
   error(char *x) {strcpy(message, x);} 
void show() 
   { 
      cout <<"Proizoshlo iskluchenie: "; 
      cout << message << endl; 
   }; 
}; 

… 

try 

   ifstream mycin("file"); 
 
char buf_fio[80]; 
int  buf_age, buf_courageousness; 
 
if(!mycin.is_open()) throw"Невозможно открыть файл. 
Объектнезагружен."; 
   mycin >> buf_fio >> buf_age >> buf_courageousness ; 
   mycin.close(); 
 
… 

catch(constchar* e) 

cout<<endl<<"Возникло исключение: "; 
cout<<e; 
cout << endl <<"Press any key..."<< endl; 
  getch();  do_up(); change(); 
}; 

… 

32
ТЕМА 8. СТАНДАРТНАЯ БИБЛИОТЕКА 
ШАБЛОНОВ (STL) 
 
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Вопросы 

1. Что такое контейнер?


2. Что такое итератор?
3. Что такое функциональный объект?
4. Что такое адаптер контейнера?
5. Перечислите последовательные контейнеры STL.
6. Перечислите ассоциативные контейнеры STL.
7. Истинно ли утверждение о том, что одной из функций итерато-
ров STL является связывание алгоритмов и контейнеров?
8. Истинно ли утверждение о том, что алгоритмы могут использо-
ваться только с контейнерами STL? Синтаксис объявления шаблона
функции.
9. Какая сущность зачастую используется для изменения поведе-
ния алгоритма?
10. В каких случаях вектор является подходящим контейнером?
11. Для чего используется алгоритм unique()?
12. Истинно ли утверждение о том, что итератор всегда может
сдвигаться как в прямом, так и в обратном направлении по контейне-
ру?
13. Пусть iter– это итератор контейнера. Напишите выражение,
имеющее значением объект, на который ссылается iter, и заставляю-
щее затем iter сдвинуться на следующий элемент контейнера.
14. Если в множество добавить ключи методомinsert(), будут ли
они отсортированы?
15. Что такое распределители памяти, и для чего они используют-
ся?
16. Могут ли STL-алгоритмы работать с массивами стиля С на ба-
зе указателей?
17. В чем разница между операциями и алгоритмами при работе с
контейнерами STL?

33
18. Что будет выведено на экран?
int main() 

std::vector<bool> v = {true, false, true, false}; 
std::vector<int>v2(v.begin(), v.end()); // 1 
v.flip(); // 2 
for (std::size_ti=0; i != v.size(); ++i) 
std::cout<< (v[i] &v2[i]); 

19. Что будет выведено на экран?
 

#include<iostream> 
#include<sstream> 
#include<algorithm> 
#include<iterator> 
 
int main() 

std::stringstr = "To be or not to be...", str2; 
std::istringstreamist(str); 
for (inti = 0; i< 2; i++) 
    { 
std::copy(std::istream_iterator<char>(ist), 
std::istream_iterator<char>(), 
std::back_inserter(str2) ); 
ist.str(str); 
    } 
std::cout<< str2; 
return 0; 

20. Что будет выведено на консоль следующим кодом?
 

#include<iostream> 
#include<vector> 
#include<algorithm> 
#include<iterator> 
usingnamespacestd; 
 
int main() { 
intArr[] = {1,2,3,1,2,3}; 
vector<int>Vec(Arr, Arr+(sizeof(Arr)/sizeof(Arr[0]))); 
sort(Vec.begin(), Vec.end()); 
unique_copy(Vec.begin(), Vec.end(), os‐
tream_iterator<int>(cout, " ")); 
return 0; 

34

21. Что выведет данная программа:
#include<utility> 
#include<vector> 
#include<algorithm> 
#include<iostream> 
 
typedefstd::pair<int, int>p_int; 
 
int main() 

std::vector<p_int> v; 
 
v.push_back(std::make_pair(3, 2)); 
v.push_back(std::make_pair(2, 3)); 
v.push_back(std::make_pair(1, 4)); 
v.push_back(std::make_pair(1, 3)); 
 
std::sort(v.begin(), v.end()); 
for (auto&x : v) 
std::cout<<x.first<<x.second; 

22. Какой контейнер необходимо использовать для быстрого по-
лучения (с логарифмической сложностью) значения по ключу? Ключ
типа int, значение типа string.
23. К каким из этих контейнеров применима функция сортировки
из <algorithm>:  template<class  _RanIt>inlinevoidstd::sort(_RanIt 
_First, _RanIt _Last) 
 std::deque 
 std::map 
 std::set 
 std::list 
 std::vector 
24. Что будет выведено на экран?
#include<iostream> 
#include<map> 
usingnamespacestd; 
 
int main() 

multimap<char, int> 
mm{{'a',1},{'b',2},{'c',3},{'a',4},{'a',5},{'c',1}}; 
map<char, int> m(++mm.begin(), mm.lower_bound('c')); 

35
for(auto i: m) 
        ++i.second; 
for(auto i: m) 
cout<<i.second<<' '; 
return 0; 

 

25. Что выведет такая программа:


#include<vector> 
#include<iostream> 
 
struct A { 
A(inti) { std::cout<<"A("<<i<<")"; } 
~A() { std::cout<<"~A()"; } 
}; 
 
int main() { 
std::vector<A *> a; 
 
for (inti = 0; i< 3; i++) { 
a.push_back(new A(i)); 

 
return 0; 

 

26. По какому критерию сортируются ассоциативные контейнеры


map при создании без явного указания критерия сортировки?
27. Что выведет такая программа:
#include<iostream> 
#include<list> 
#include<iterator> 
#include<algorithm> 
usingnamespacestd; 
 
int main() { 
list<int>coll; 
for(inti=1;i<=9;++i) 
   { 
coll.push_back(i); 
   } 
list<int>::iterator pos; 
pos=find(coll.begin(), coll.end(), 5); 
cout<< *pos<<' '; 
list<int>::reverse_iteratorrpos(pos); 

36
cout<< *rpos<<' '; 
list<int>::iterator rrpos;  
rrpos=rpos.base(); 
cout<< *rrpos<<' '; 
return 0; 

28. Какие утверждения о предикатах и функторах верны (укажите
все подходящие варианты)?
 Предикат может быть только структурой, а функтор – еще
и классом.
 Предикаты могут использоваться для сортировки элемен-
тов в контейнерах.
 Предикат – частный случай функтора.
 Метод operator() функтора может возвращать только зна-
чения типа bool.
 Для функтора должен быть переопределен operator<
 

29. Какая ошибка произойдет в этом коде:


 

#include<vector> 
#include<algorithm> 
#include<cmath> 
 
int main(intargc, char *argv[]) 

constintXmin = ‐6; 
constintXmax = 6; 
 
std::vector <double>xArray; 
std::vector <double>yArray; 
for (inti=Xmin; i<Xmax;  i += 0.001) 

xArray.push_back(i); 
yArray.push_back(sin(i)); 
i += 0.2; 
    } 
 
return 0; 

30. Куда указывает итератор ptr после выполнения следующих
двух строк кода:
vector<int>vec(100); 
vector<int>::iterator ptr=vec.end(); 

37
Задачи для самостоятельного решения 

Общее задание. Проект должен содержать демонстрации: ис-


пользования контейнерных классов для хранения встроенных типов
данных; использования контейнерных классов для хранения пользова-
тельских типов данных; использования алгоритмов STL.
1. Создать объект-контейнер в соответствии с вариантом задания
(первая колонка таблицы) и заполнить его данными, тип которых
определяется также вариантом задания (вторая колонка таблицы).
Просмотреть контейнер.
2. Изменить контейнер, удалив из него одни элементы и заменив другие.
3. Просмотреть контейнер, используя для доступа к элементам
итераторы.
4. Изменить контейнер, удалив из него nэлементов после заданно-
го. Просмотреть контейнер.
5. Отсортировать контейнер по убыванию элементов. Просмот-
реть контейнер.
6. Выполнить пункты №1–4, но для данных пользовательского
типа (в качестве пользовательского типа данных использовать пользо-
вательский класс задания № 1). Для вставки и удаления элементов
контейнера использовать соответствующие операции, определенные
в классе контейнера. Для ввода-вывода объектов пользовательского
класса следует перегрузить операции>>и <<.
7. Используя подходящий алгоритм, найти в контейнере пользо-
вательского типа заданный элемент (задать значение самостоятельно).
8. Подсчитать, сколько элементов, удовлетворяющих заданному
условию, содержат все контейнеры проекта.

Индивидуальноезадание (по вариантам)


Вариант Контейнер STL Встроенныйтипданных
1 stack char 
2 multimap int 
3 list long 
4 deque float 
5 stack double 
6 queue char 
7 vector string 
8 set int 
9 vector double 
10 map int 

38
ТЕМА 9. КЛАССЫ, ИНТЕРФЕЙСЫ  
И НАСЛЕДОВАНИЕ В С# 
 
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.

Вопросы 
1. Перечислите пять разновидностей членов класса специфичных
для языка C#.
2. Приведите синтаксис описания класса С# в общем виде. Проил-
люстрируйте его фрагментом программы.
3. Какие модификаторы типа доступа Вам известны?
4. В чемзаключаютсяособенностидоступачленовклассас модифика
тором public?
5. В чем заключаются особенности ступачленовкласса
с модификатором private?
6. В чем заключаются особенности доступа членов класса
с модификатором internal?
7. Приведитесинтаксиссозданияобъектавобщем виде.
8. Какие умолчания для конструкторов приняты в языке C#?
9. Каким значением инициализируются по умолчанию значения
ссылочного типа?
10. Приведите синтаксисописаниянаследованияклассов вобщем-
виде. Проиллюстрируйте его фрагментом программы на языке C#.
11. Какие операторы языка C# являются важнейшими для обра-
ботки исключений?
12. Необходимо ли обеспечивать соответствие типов исключения
в операторе catch типу перехватываемого исключения?
13. В каком случае возможно использование оператора языка C#
catch без параметров?
14. Каким образом осуществляется возвратв программу после об-
работки исключительной ситуации?
15. Зависит ли вызов блока finally от наличия исключения?
16. Какой оператор языка C# используется для явной генерации
исключений?
17. Какой системный класс является базовым для создания ис-
ключений?

39
18. Что напечатает этот код:
usingSystem.Collections.Generic; 
using System; 
classTest { 
delegateintF(); 
staticvoid Main() 
    { 
List<F>fs = newList<F>(); 
int[] xs = { 1, 2, 3 }; 
 
for (inti = 0; i< 3; i++) 
        { 
fs.Add( () =>xs[i]); 
        } 
 
foreach (Ffinfs) 
        { 
Console.WriteLine(f()); 
        } 
Console.ReadLine(); 
    } 

 

19. Что выведет данный код:


 

using System; 
classTest 

staticvoid Main(string[] args) 

Aa = newB(); 
CallMethod1(a); 
        a = newC(); 
CallMethod1(a); 
 
Console.ReadKey(); 
    } 
 
publicstaticvoid CallMethod1(A item) 
    { 
Bb = item asB; 
b.Method1(); 
    } 

 
abstractclassA 

40

publicvirtualvoid Method1() 
    { 
Console.WriteLine("A.Method1"); 
    } 

 
classB : A 

publicoverridevoid Method1() 
    { 
Console.WriteLine("B.Method1"); 
    } 

 
classC : A 

publicoverridevoid Method1() 
    { 
Console.WriteLine("C.Method1"); 
    } 

20. Что напечатает следующий код:
classA 

publicvirtualint m(refinti) 
    { 
i = 1; 
returni; 
    } 

classB : A 

publicoverrideint m(refinti) 
    { 
i = 2; 
returni; 
    } 

internalclassProgram 

inti; 
 
privatestaticvoid Main(string[] args) 

41
    { 
Aa = newB(); 
Console.WriteLine(a.m(refi)); 


21. Скомпилируется ли следующий код:
 
interfaceInterface1 

void F(); 
void G(); 

classClass1 

publicvoid F() { } 
publicvoid G() { } 

classClass2 : Class1, Interface1 

newpublicvoid G() { } 

22. Чем могут быть M1, M2, M3, M4, если дан следующий код:
publicclassC1 : M1, M2 { } 
publicstructS1 : M3, M4 { }; 
23. Какие строки вызовут ошибку компиляции:
interfaceIList 

int Count { get; set; } 

interfaceICounter 

void Count(inti); 

interfaceIListCounter : IList, ICounter { } 
classC 

void Test(IListCounter x)      // 1 
    { 
x.Count(1);                // 2 
x.Count = 1;   // 3 
    } 

42
24. Что напечатает следующий код:
classBase 

publicStringclassName = "Base"; 

classDerived : Base 

privatenewStringclassName = "Derived"; 

classTest 

staticvoid Main(string[] args) 
    { 
Console.WriteLine(newDerived().className); 


25. В каких строках кода возникнет ошибка компиляции:
classOuterClass 

privateinti; 
protectedint j; 
publicint k; 
 
publicOuterClass() 
    { 
InnerClass nested = newInnerClass(this); 
nested.a = 1;  // 1 
nested.b = 1;  // 2 
nested.c = 1;  // 3 
    } 
 
classInnerClass 
    { 
privateint a; 
protectedint b; 
publicint c; 
publicInnerClass(OuterClassouterClass) 
        { 
outerClass.i = 1;  // 4 
outerClass.j = 1;  // 5 
outerClass.k = 1; 
        } 
    } 

43
26. Скомпилируется ли следующий код:
interfaceIControl 

void Paint(); 

interfaceIForm 

void Paint(); 

classPage : IControl, IForm 

publicvoidPaint() { } 

27. Даны следующие классы:
publicclassTest 

inttestInt = 5; 
publicintgetInt() { returntestInt; } 

classAnother 

// тело класса 

 

Укажите все способы получения значения testInt из тела класса


Another.

Задачи для самостоятельного решения 
Общее задание.Определить иерархию классов (в соответствии
с вариантом). Классы (минимум один) должны содержать конструкторы
(с параметрами и без), статический конструктор,свойства (get,
set),переопределение методов (override) в производных клас-
сах.Создайте в одном из классов статический метод вывода количества
объектов и статическое поле – номер объекта.
В проекте должны быть или интерфейс(при множественном насле-
довании), илиабстрактный класс (приединичном наследовании).
В методах класса (минимум в одном) для работы с аргументами ис-
пользуйте ref - и out-параметры.
При возникновении ошибок должны выбрасываться исключения.
Выполните обработку исключений, используя try, catch и finally.
Создайте бесплодный класс, указанный в варианте.

44
Напишите демонстрационную программу, в которой создаются объ-
екты различных классов и добавляются в коллекцию из пространства
именSystem.Collections.
Далее приведен перечень классов.

Индивидуальное задание(по вариантам)


Вариант Задание
Классы – человек, абитуриент, студент, преподаватель, зав.
1
кафедрой ИСиТ (бесплодный)
2 Классы – растение, дерево, цветок, роза, marella (бесплодный)
Классы – кадры,рабочий, инженер, администрация, зам. ген.
3
директора (бесплодный)
Классы – БГТУ, факультет, группа, подгруппа, факультет
4
ИДиП (бесплодный)
Классы – печатное издание, журнал, книга, учебник, журнал
5
«On-liner»(бесплодный)
Классы – млекопитающие, парнокопытные, птицы, живот-
6
ное, тибетский волк (Canislupuslaniger) (бесплодный)
7 Классы – место, область, город, деревня, Минск (бесплодный)
Классы – товар, радиотовары, продукт, молочный продукт,
8
транзистор, фен (бесплодный)
Классы – тест, экзамен, выпускной экзамен, испытание,
9
ООП-экзамен (бесплодный)
Классы – республика, монархия, королевство, государство,
10
РБ (бесплодный)

45
ТЕМА 10. ОБОБЩЕНИЯ И ПЕРЕГРУЗКА 
ОПЕРАТОРОВ C# 
 
Изучите теоретический материал [1]. Выполните самостоятельно
задание в соответствии с вариантом.

Вопросы 

1. Как создать класс обобщенного типа? Сколько у него может


быть параметров?
2. Задайте обобщение с ограничением на тип базового класса
в аргументе обобщения.
3. Какие задачи решает ограничение в обобщении?
4. Для чего используется оператор default в следующем фрагмен-
те кода:
 

classTest<T> 

public T obj; 
public Test() 
    { 
 
obj = default(T);  
  } 
5. Напишите обобщенный метод поиска заданного значения
в списке.
6. Для чего используются обобщенные делегаты? Приведите пример.
7. Можно ли наследовать от обобщенного класса?
8. Можно ли определять обобщенные свойства?
9. Какие ограничения существуют в обобщенных классах?
10. Приведите обобщенную форму перегрузки операторов в С#.
11. Перечислите ограничения на перегрузку операторов отношения.
12. Могут ли быть перегружены ключевые слова true и false?
13. Какие логические операторы подлежат перегрузке?
14. Приведите две формы операторов преобразования: явную
и неявную.
15. Перечислите существующие ограничения на операторы пре-
образования.
16. Перечислите операторы, которые нельзя перегружать.

46
Задачи для самостоятельного решения 

Общее задание. Создать заданный в вариантеобобщенный класс.


Определить в классе индексаторы, конструкторы, деструктор, необхо-
димые функции и заданные перегруженные операции.
В методах класса для работы с аргументами используйте ref‐
и out‐параметры и операторы is или as, foreach. Используйте обра-
ботку исключительных ситуаций.

Индивидуальное задание (по вариантам)


Вариант Задание
Класс – одномерный массив. Дополнительно перегрузить
следующие операции: * – умножение массивов;int()  –
1
преобразование; ==,  != – проверка на равенство, неравен-
ство; <=, >=– сравнение
Класс – одномерный массив. Дополнительно перегрузить
следующие операции: == – проверка на равенство; != –
2
проверка на неравенство; ++ – инкремент массивов; ‐‐–
декремент массивов
Класс – множество Сset. Дополнительно перегрузить сле-
дующие операции: + – добавить элемент в множество (ти-
3
па set + item); * – пересечение множеств,==, != – проверка
множеств на равенство, неравенство
Класс – очередь Сqueue. Дополнительно перегрузить сле-
дующие операции: + – добавить элемент; ‐ – извлечь эле-
мент; bool  ()  – проверка, пустая ли очередь; < –
4
копирование одной очереди в другую с сортировкой в
убывающем порядке; >– копирование одной очереди в
другую с сортировкой в возрастающем порядке
Класс – множество Сset. Дополнительно перегрузить сле-
дующие операции: + – объединение множеств; <=,  >= –
5
сравнение множеств; int  ()– мощность множества; &– пе-
ресечение
Класс – однонаправленный список list. Дополнительно
перегрузить следующие операции: + – объединить два
6
списка; ‐ – удалить элемент;==,  != – проверка на равен-
ство, неравенство; ~– проверка, пустой ли список

47
Вариант Задание
Класс – матрица. Дополнительно перегрузить следующие
операции: + – сложение матриц; ()  – доступ по индексу
7
M(с, i); >, < – сравнение матриц; == – копирование матриц,
!= – проверка соответсвия размеров матриц
Класс – время CVector. Дополнительно перегрузить следу-
ющие операции: + – добавление элемента; ++,  ‐‐ – увели-
8
чение и уменьшения всех элементов вектора на один
(СVector++); !=, == – проверка на неравенство, равенство
Класс – время CVector. Дополнительно перегрузить следу-
ющие операции: ‐ – разность двух векторов; + – сложение
9
элементов вектора с целым; !=, == - проверка на неравен-
ство, равенство
Класс – стек Сstack. Дополнительно перегрузить следую-
щие операции: + – добавить элемент в стек; ‐ – извлечь
10 элемент из стека; ~ – проверка, пустой ли стек; > и < – ко-
пирование одного стека в другой с сортировкой в возрас-
тающем порядке

48
ЛИТЕРАТУРА 
 
1. Пацей, Н. В. Объектно-ориентированное программирование:
учеб.-метод. пособие: в 2 ч./ Н. В. Пацей. – Минск: БГТУ, 2013.–
Ч. 2.– 186 с.
2. Прата, С. Язык программирования C++: лекции и упражнения /
C. Прата;пер. с англ. – 6-е изд. – М.: Издат. дом «Вильямс», 2012. –
1248 с.
3. Рихтер, Дж. CLR via С#. Программирование на платформе
Microsoft .NET Framework 4.0 на языке С#/ Дж.Рихтер.– 3-е изд. –
СПб.: Питер,2012. –928 с.
4. Шилдт, Г. С# 4.0: полное руководство/ Г. Шилдт; пер. с англ. –
М.: Издат. дом «Вильямс», 2011. –1056 с.
5. Медведев, В.И. Особенности объектно-ориентированного про-
граммирования на C++/CLI, C# и Java/ В. И. Медведев. – 2-е изд.,
испр. и доп.– Казань: РИЦ «Школа», 2010.– 444 c.
6. Хортон, А.VisualC++ 2005. Базовый курс / А.Хортон. – М.: Из-
дат. дом «Вильямс», 2007. – 1152 с.
7. Харви, Д. Как программировать на С++ / Д. Харви, П.Дейтел.–
М.: БИНОМ,2007. –1156 с.
8. Нейгел, К. C# 2005 для профессионалов/К. Нейгел;пер. с англ. –
M.: Издат. дом «Вильямс», 2007.
9. Ноутон, П. Java 2/П. Ноутон, Г. Шилдт; пер. с англ. –СПб.: БХВ-Пе-
тербург, 2007. – 1072 c.
10. Медведев, В.И. Программирование на С++, C++.NET/C# и
.NET компоненты / В.И.Медведев.– 2-е издание.– Казань: Мастер
Лайн, 2007. – 296 c.
11. Медведев, В.И. .NET компоненты, контейнеры и удаленные
объекты / В.И.Медведев.– Казань: РИЦ «Школа», 2006. – 320 c.
12. Александреску, А. Современное проектирование на C++ (серия
C++ inDepth)/А. Александреску. – М.: Издат. дом «Вильямс», 2008. –
336 с.
13. Влиссидес, Дж. Применение шаблонов проектирования.
Дополнительные штрихи/ Дж.Влиссидес.– М.: Издат. дом «Вильямс»
2003.– 144 с.
14. Приемы объектно-ориентированного проектирования. Паттер-
ны проектирования. / Э. Гамма[и др.].–СПб.: Питер, 2010.– 368с .

49
СОДЕРЖАНИЕ 

ПРЕДИСЛОВИЕ ......................................................................................... 3
ТЕМА 1. КЛАССЫ И ОБЪЕКТЫ ............................................................ 4
Вопросы ........................................................................................................ 4
Задачи для самостоятельного решения ..................................................... 6
ТЕМА 2. НАСЛЕДОВАНИЕ .................................................................... 8
Вопросы ........................................................................................................ 9
Задачи для самостоятельного решения ................................................... 14
ТЕМА 3. АБСТРАКТНЫЕ КЛАССЫ .................................................... 15
Вопросы ...................................................................................................... 16
Задачи для самостоятельного решения ................................................... 18
ТЕМА 4. ДИНАМИЧЕCКАЯ ИДЕНТИФИКАЦИЯ ТИПОВ ............. 20
Задачи для самостоятельного решения ................................................... 20
ТЕМА 5. ПЕРЕГРУЗКА ОПЕРАЦИЙ ................................................... 21
Вопросы ...................................................................................................... 22
Задачи для самостоятельного решения ................................................... 23
ТЕМА 6. ШАБЛОНЫ КЛАССОВ И ФУНКЦИЙ ................................ 26
Вопросы ...................................................................................................... 26
Задачи для самостоятельного решения ................................................... 28
ТЕМА 7. РАБОТА С ПОТОКАМИ, ОБРАБОТКА ИСКЛЮЧЕНИЙ . 30
Вопросы ...................................................................................................... 30
Задачи для самостоятельного решения ................................................... 31
ТЕМА 8. СТАНДАРТНАЯ БИБЛИОТЕКА ШАБЛОНОВ (STL) ....... 32
Вопросы ...................................................................................................... 33
Задачи для самостоятельного решения ................................................... 38
ТЕМА 9. КЛАССЫ, ИНТЕРФЕЙСЫ И НАСЛЕДОВАНИЕ В С# ...... 39
Вопросы ...................................................................................................... 39
Задачи для самостоятельного решения ................................................... 44
ТЕМА 10. ОБОБЩЕНИЯ И ПЕРЕГРУЗКА ОПЕРАТОРОВ C# ......... 46
Вопросы ...................................................................................................... 46
Задачи для самостоятельного решения ................................................... 47
ЛИТЕРАТУРА ........................................................................................... 49

50
Учебное издание

ПацейНаталья Владимировна

ОБЪЕКТНО‐ОРИЕНТИРОВАННОЕ 
ПРОГРАММИРОВАНИЕ НА С++/C# 
 
Лабораторный практикум

Редактор Ю. Д. Нежикова
Компьютерная верстка Я. Ч. Болбот
Корректор Ю. Д. Нежикова

Издатель:
УО «Белорусскийгосударственныйтехнологическийуниверситет».
Свидетельство о государственнойрегистрациииздателя,
изготовителя, распространителяпечатныхизданий
№ 1/227 от 20.03.2014.
Ул. Свердлова, 13а, 220006, г. Минск.

51

Вам также может понравиться