Опишите применение директив препроцессора #include и #define.
Опишите применение директив препроцессора #include и #define.
Лексический анализ программы. Примеры выделения лексем.
Основные группы лексем, выделяемые компилятором. Примеры выделения лексем.
Примеры строковых литералов. Размещение длинной строковой константы в нескольких строках.
Примеры определений символьной константы. Отличие между 'a' и “a”.
Примеры числовых литералов в разных системах счисления (8, 16, 10).
Примеры определений вещественной константы. Можно ли в одном операторе определить несколько переменных разных типов?
Явное указание требуемого типа для числа в выражении. Примеры инициализации переменных одним и тем же значением в 10-ной и 16-ной системах счисления.
Пустая строка» и ее внутреннее представление.
Правила выбора идентификатора пользователя. Может ли он совпадать с ключевым словом и со стандартным идентификатором?
Понятие «тип» информационного объекта и его характеристики.
Понятие переменной.
14. *Атрибуты информационного объекта и их характеристика.
Классы памяти и их назначение.
Совпадает ли область видимости переменной с областью действия?
Что такое «область действия идентификатора»? Как она определяется?
Какую переменную называют локальной? Как определяется область действия локальной переменной? Какова протяженность области видимости «локального имени» ?
Какую переменную называют глобальной? Как определяется область действия глобальной переменной? Какова протяженность области видимости «глобального имени» ?
20. Привести примеры, когда описание имени скрывает другое описание этого же имени. Примеры скрытого глобального и скрытого локального имени и обращения к ним.
Примеры использования переменных с разными атрибутами и разным пространством имен.
22. Указать область действия для всех идентификаторов:
int cube(int y);
void main() {int x; for (x=1; x<=10; x++) cout<<cube(x)<<endl;}
int cube(int e){return e*e*e;}
23. Указать область видимости переменных, используемых в блоке:
int x = 11;
Void f4()
{
int y = x;
int x = 22;
y = x;
}
Как транслятор определяет класс памяти для переменной?
Пример соотношения областей видимости и действия в многофайловом проекте.
Укажите неверные объявления
int func()
{
static int a;
int static b;
int extern c;
extern int k;
extern static int d;
}
Объяснить различие между описанием, определением и объявлением переменной.
28. Эквивалентны ли записи:
const int i = 17;
#define i 17
29. Указать определения:
char ch;
char* name = "Njal";
struct complex { float re, im; };
complex cvar;
extern complex sqrt(complex);
extern int error_number;
typedef complex point;
float real(complex* p) { return p->re; };
const double pi = 3.1415926535897932385;
struct user;
template<class T> abs(T a) { return a<0 ? -a : a; }
enum beer { Carlsberg, Tuborg, Thor };
30. Указать объявления:
char ch;
char* name = "Njal";
struct complex { float re, im; };
complex cvar;
extern complex sqrt(complex);
extern int error_number;
typedef complex point;
float real(complex* p) { return p->re; };
const double pi = 3.1415926535897932385;
struct user;
template<class T> abs(T a) { return a<0 ? -a : a; }
enum beer { Carlsberg, Tuborg, Thor };
31. Структура программы, программного файла и функции на С++.
Можно ли определить вложенные функции? Если да, то каким образом и какова допустимая глубина вложенности?
33. *Структура программы состоящей из нескольких программных файлов на примере программы сортировки строк.
34. Указать и объяснить ошибку, если она есть:
1. const int j = 17;
j = 29;
2. const int j (17);
3. const int i;
4. int &i =2;
5. int count;
int count;
6. extern int error_number;
extern short error_number;
7. extern int error_number;
extern int error_number;
8. void f5(int x)
{
intx;
}
35. Можно ли в одном операторе инициализировать несколько переменных?:
36. Может ли тип инициализирующего выражения не совпадать с типом определяемой переменной? Если да, то приведите примеры.
Как определить размер памяти для переменной типа int. От чего он зависит?
Зачем используются спецификаторы short, long?
39. Логические операции и выражения. Короткая схема вычисления логического выражения (примеры).
40. Поразрядные логические операции (примеры использования).
41. Операции ! ~ & % .
42. Операции / << ^ .
43. Операции >> || &&.
Операции ? , (тип).
Операция sizeof?
46. Вычислить значение:
char var = 0x1F & 9 >> 1 + 1;
С помощью какой операции и как можно найти остаток от деления числа (unsignedi) на 2, 4 и т.д.
52. Операции сдвига (примеры их использования для умножения и деления на степень 2).
Примеры формулировки высказываний по логическому выражению.
58. Как записать тернарную операцию для оператора:
if (x<0) x=5;
59. Интерпретировать запись:
if (a=b) выражение;
if (a<x<b) выражение;
if (int i=fun(k)) выражение;
60. Особенности выполнения операций ++ --.
61. Корректно ли выражение?
++х = fun(x);
x<<y;
Алгоритм и его свойства.
Содержание понятия «структурное программирование».
Циклические алгоритмы.
Синтаксис оператора switch?
Примеры выражения оператора цикла for через while.
80. Реализация в С++ алгоритмов циклов с параметром.
81. Реализация в С++ алгоритмов с итерационными циклами.
Пример использования inline-функции.
129. *Пример функции, получающей в качестве параметра и возвращающей значения перечислимого типа.
Перегрузка функций. Примеры перегрузки функций.
Примеры неоднозначности при перегрузке функций.
132. Назначение и пример реализации шаблона семейства функций.
133. *Как передать функции переменное число параметров? Как их обработать?
Main ()
{int x=2;
int y=5;
swap(&x, &y, 5);
cout << x << " " << y << endl;
return 0;
}
void swap(int* p, int* q, int)
{
intt = *p;
*p = *q;
*q = t;
}
139. *Какие возможности предоставляет неиспользуемый формальный параметр в функции?
Voidg()
{
inti = 1;
intj = 1;
f(i, j);
}
Понятие рекурсии. Пример рекурсии с выполнением действий на рекурсивном спуске и на рекурсивном возврате.
166. *Структура рекурсивной функции. Условия «правильного» рекурсивного определения.
167. *Рекурсивная функция вычисления чисел Фибоначчи. Вычисление НОД через итерации и через рекурсивную функцию.
Определите понятие «массив». Обращение к элементам массива (в том числе и через указатель). Примеры инициализации массива.
169. Чемусоответствуетзаписьint *anArray:
anArray[0], anArray[1], *anArray[0], *anArray[1]
Правила передачи одномерного массива функции в качестве параметра. Пример.
Пример функции, возвращающей указатель на одномерный массив.
Пример функции, возвращающей ссылку на элемент массива.
Пример проверки значений одномерного массива на упорядоченность.
178. Перегрузка шаблона функций на примере обмена значений
переменных и обмена значений одномерных массивов.
Примеры работы с символьными массивами.
180. Особенности задания строки как массива символов.
181. Укажитеотличия :
char str[]=”qwerty”;
char str[12]=”qwerty”;
char *str=”qwerty”;
Поиск в массиве.
212. *Инвертирование строки с помощью рекурсивной функции.
Содержание этапов жизненного цикла ПО.
Class Sample
{
public:
Sample()
{
cout << "Constructor" << endl;
}
void * operator new(size_t size)
{ cout << "Operator New" << endl;
return ::new Sample();
}
void operator delete(void *p, size_t size)
{ ::delete p;
cout << "Operator Delete" << endl;
}
~Sample()
{ cout << "Destructor" << endl;
}
};
Void main()
{ Sample *ptr = new Sample;
delete ptr;
}
67.Друзья классов как возможность расширения интерфейса класса. Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется?
68.Выберите верный вариант объявления метода M() класса A другом класса B:
· class B {friend void A::M(); };
· class B :friendA::M(){ };
· class A {friend class B void M(); };
69.Опишите синтаксис определения производного класса. Как в производном классе определяется доступность полей базового класса? Какие функции не наследуются?
70.Дана иерархия классов:
class Base {
public:
bar( int );
protected:
int ival;
};
class Derived1 : virtual public Base {
public:
bar( char );
foo( char );
protected:
char cval;
};
class Derived2 : virtual public Base {
public:
foo( int );
protected:
int ival;
char cval;
};
class VMI : public Derived1, public Derived2 {};
К каким из унаследованных членов можно обращаться из класса VMI, не квалифицируя имя? А какие требуют квалификации?
71.Дан класс Base с тремя конструкторами:
class Base {
public:
Base();
Base( string );
Base( const Base& );
protected:
string _name;
};
Определите соответствующие конструкторы для каждого из следующих классов:
(a) любойиз
class Derived1 : virtual public Base { ... };
class Derived2 : virtual public Base { ... };
(b) class VMI : public Derived1, public Derived2 { ... };
(c) class Final : public VMI { ... };
72.Какие из следующих объявлений ошибочны? Почему?
· class CADVehicle : public CAD, Vehicle { ... };
· class DoublyLinkedList:public List, public List { ... };
· class iostream: private istream, private ostream { ... };
73.Дана иерархия, в каждом классе которой определен конструктор по умолчанию:
class A { ... };
class B : public A { ... };
class C : public B { ... };
class X { ... };
class Y { ... };
class Z : public X, public Y { ... };
class MI : public C, public Z { ... };
Каков порядок вызова конструкторов в таком определении: MI mi;
74.Дана иерархия, в каждом классе которой определен конструктор по умолчанию:
class X { ... };
class A { ... };
class B : public A { ... };
class C : private B { ... };
class D : public X, public C { ... };
Какие из следующих преобразований недопустимы:
D *pd = new D;
X *px = pd;
A *pa = pd;
B *pb = pd;
C *pc = pd;
75.Чем открытое наследование отличается от закрытого и защищенного?
76.При порождении класса-наследника от базового класса с атрибутом public
public-компоненты базового класса становятся компонентами производного класса с атрибутом …?
77.При порождении класса-наследника от базового класса с атрибутом private public-компоненты базового класса становятся компонентами производного класса с атрибутом …?
78.Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен? Что происходит, если имя метода-наследника совпадает с именем базового метода?
79.Дана иерархия классов, обладающая набором виртуальных функций:
class Base {
public:
virtual ~Base();
virtual ostream& print();
virtual void debug();
virtual void readOn();
virtual void writeOn();
};
class Derived1 : virtual public Base {
public:
virtual ~Derived1();
virtual void writeOn();
};
class Derived2 : virtual public Base {
public:
virtual ~Derived2();
virtual void readOn();
};
class MI : public Derived1, public Derived2 {
public:
virtual ~MI();
virtual ostream& print();
virtualvoiddebug();
};
Какой экземпляр виртуальной функции вызывается в каждом из следующих случаев:
Base *pb = new MI;
pb->print();
pb->debug();
pb->readOn();
pb->writeOn();
pb->log();
delete pb;
80.Сформулируйте принцип подстановки. Что такое срезка (расщепление) объекта и когда она происходит? Когда срезка происходит при копировании объектов?
81.Дана иерархия классов, обладающая набором виртуальных функций:
class Base {
public:
virtual ~Base();
virtual ostream& print();
virtual void debug();
virtual void readOn();
virtual void writeOn();
};
class Derived1 : virtual public Base {
public:
virtual ~Derived1();
virtual void writeOn();
};
class Derived2 : virtual public Base {
public:
virtual ~Derived2();
virtual void readOn();
};
class MI : public Derived1, public Derived2 {
public:
virtual ~MI();
virtual ostream& print();
virtualvoiddebug();
};
Определите, какие виртуальные функции активны при вызове через pd1 и d2:
· Derived1 *pd1 =new MI;
· MI obj;
Derived2 d2 = obj;
82.Укажите правильные операторы присваивания:
Base& Base operator=(const Base & t);
Derive& Derive operator=(const Derive & t);
Base b1, b2;
Derive d1, d2;
b1=b2;
d1=d2;
b1=d2;
d1=b1;
d2=b1;
83.Укажите правильные операторыприсваивания:
Base& Base operator=(const Base & t);
Derive& Derive operator=(const Derive & t);
Derive& Derive operator=(const Base & t){
this--> Base::operator=(t);
return *this;
}
Base b1, b2;
Derive d1, d2;
b1=b2;
d1=d2;
b1=d2;
d1=b1;
d2=b1;
84.Выполняется ли принцип подстановки при открытом множественном наследовании?
85.Укажите особенности использования указателей базового класса для производного класса.
86.Виртуальное наследование, его преимущества и недостатки по сравнению с обычным наследованием? Влияет ли виртуальное наследование на размер класса?
87.Назвать виртуальные функции и объяснить их работу:
struct base {
virtual void f1() { cout << "\nbase::f1"; }
virtual void f2() { cout << "\nbase::f2"; }
virtual void f3() { cout << "\nbase::f3"; }
};
struct dir: public base {
void f1() { cout << "\ndir::f1"; }
intf2() { cout << "\ndir::f2"; }
void f3(int i) { cout << "\ndir::f3::i = " << i; }
};
Void main()
{ base B, *pb = &B;
dir D, *pd = &D;
pb->f1();
pb->f2();
pb->f3();
pd->f1();
pd->f2();
pd->f3();
pd->f3(0);
pb = &D;
pb->f2();
pb->f3();
pb->f3(3);
}
88.*Может ли виртуальное наследование быть одиночным? Объясните, каким образом с помощью виртуального наследования можно вообще запретить наследование.
89.Что такое связывание? Чем «раннее» связывание отличается от «позднего»? Зачем виртуализируются методы класса?
90. *Как «сделать виртуальными»friend-функции для перегруженных операторов ввода-вывода?
91.Можно ли наследовать деструктор? Зачем виртуализировать деструктор?
92.Определите понятие «чистый виртуальный метод», «абстрактный класс». Как объявляется «чистая» виртуальная функция?
93.Если известно, что метод никогда не будет вызываться в базовом классе, а будут вызываться только его переопределенные версии в производных классах, то как лучше объявить такой метод?
94.*Опишите понятие «множественное наследование». Размеры классов при множественном наследовании. Какие проблемы возникают при множественном наследовании?
95.Укажите результат:
class B{
public:
virtual void msg () {cout << "classB ";}
};
class D: public B{
public:
virtual void msg() {cout << "classD ";}
};
int main() {
B * var = new D;
var->msg();
}
96.Дайте определение контейнера. Какие виды встроенных контейнеров в С++ вы знаете?
97.Какие виды доступа к элементам контейнера вам известны? Чем отличается прямой доступ от ассоциативного? Перечислите операции, которые обычно реализуются для последовательного доступа к элементам контейнера.
98.Дайте определение итератора. Можно ли реализовать последовательный доступ без итератора? В чем преимущества реализации последовательного доступа с помощью итератора? Что играет роль итератора для массивов С++?
99.Имеются ли ошибки в следующих определениях?
· int ia[ 7 ] = { 0, 1, 1, 2, 3, 5, 8 };
· vector< vector< int > > ivec;
· vector< int > ivec = { 0, 1, 1, 2, 3, 5, 8 };
· vector< int > ivec( ia, ia+7 );
· vector< string > svec = ivec;
· vector< string > svec( 10, string( "null" ));
100. Проиллюстрируйте графически трассировку алгоритма проверки баланса фигурных скобок и покажите состояние стека на каждом этапе:
x{{yz}} {x{y{{z}}} {{{x}}}
101. *Примените решение задачи о балансе фигурных скобок для выражения, содержащего 3 типа разделителей: ( ), [ ], { }. Проиллюстрируйте графически трассировку алгоритма проверки баланса скобок:
[x{(yz)}] {x[y{(z)}] ({[x]}) )
102. *Расскажите алгоритм вычисления постфиксного выражения ab-c+
(a=7, b=3, c=-2). Покажите состояние стека после каждого шага.
103. *Есть стеки aStack и auxStack. Выполнить задание, пользуясь лишь операциями над абстрактным стеком (стеком, не зависящим от реализации):
- вывести содержимое aStack в обратном порядке;
- определить количество элементов в aStack, оставив его неизменным;
- удалить все вхождения заданного элемента в aStack, оставив порядок следования его элементов неизменным.
104. Схема памяти класса.
105. Как необходимо объявить переменную a, чтобы вызов a.Ouput() выводил результат"Goodbye":
· template<class T, class T2>
class A {
public:
void Output()
{
cout << "Hello";
}
};
· template<class T2>
class A<char, T2> {
public:
void Output()
{
cout << "Goodbye";
}
};
106. Исключения. Ключевые слова С++, которые используются для обработки исключений. Каким образом исключение генерируется? Каковы функции контролируемого блока? Что обозначается ключевым словом catch?
107.Куда передается управление после обработки исключения? Перечислите возможные способы выхода из блока обработки.
108. Какого типа может быть исключение? Какими способами разрешается передавать исключение в блок обработки? Сколько параметров разрешается писать в заголовке секции-ловушки? Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки.
109. Сколько секций-ловушек должно быть задано в контролируемом блоке? Как определяется, какому блоку catch передается исключение для обработки? Что произойдет, если несколько обработчиков соответствуют типу исключения?
110.Напишите конструкцию, которая позволяет перехватить любое исключение.
111. Могут ли контролируемые блоки быть вложенными? Если в блоке try не генерируются никакие исключения, куда передается управление после его завершения? Что произойдет, если исключение сгенерировано вне блока try?
112. Как организуется передача исключения в объемлющий блок? Каким образом исключение «передать дальше»?
113. Что такое «иерархия исключений»?
114. Что такое «спецификация исключений»? Как описывается список исключений, которые могут быть сгенерированы в функции? Что происходит, если функция нарушает спецификацию исключений? Учитывается ли спецификация исключений при перегрузке функций?
115. Прокомментируйте приведенный код. Будет ли сделан вызов b->printBase();
class CBase
{
int m_i;
public:
CBase() : m_i (0){}
void printBase() { cout<<"CBase"<<endl; }
};
int main()
{
CBase* b = NULL;
b->printBase();
return 0;
}
Опишите применение директив препроцессора #include и #define.
Лексический анализ программы. Примеры выделения лексем.
Основные группы лексем, выделяемые компилятором. Примеры выделения лексем.
Примеры строковых литералов. Размещение длинной строковой константы в нескольких строках.
Примеры определений символьной константы. Отличие между 'a' и “a”.
Примеры числовых литералов в разных системах счисления (8, 16, 10).
Примеры определений вещественной константы. Можно ли в одном операторе определить несколько переменных разных типов?
Явное указание требуемого типа для числа в выражении. Примеры инициализации переменных одним и тем же значением в 10-ной и 16-ной системах счисления.