- •1. Приведите определение одного и того же числа в 10-ной и 16-ной системах счисления.
- •4. Приведите примеры определения строковых литералов. Как разместить длинную строковую константу в нескольких строках? Что такое «пустая строка»? Ее внутреннее представление.
- •6. Как явно указать, что константа должна иметь некоторый требуемый тип?
- •7. Как определяется переменная булевского типа? Ее значения и внутреннее представление.
- •33. Определите назначение операций ? , (тип)
- •73. Укажите способы доступа к полям структуры. Можно ли присвоить одну структуру другой?
- •74. Можно ли структуру возвратить из функции?
- •75. Как определить битовые поля?
- •76. Приведите синтаксис объявления и определения функции. Укажите область действия параметров функций.
- •77. Какие типы возвращаемых значений недопустимы для функций?
- •78. Как вернуть массив из функции? Укажите особенности передачи массивов как параметров.
- •79. Укажите особенности передачи параметров функций по значению, по адресу, по ссылке.
- •80. Можно ли объявить параметры функции с модификаторами?
- •81. Опишите особенности задания параметров функций со значениями по умолчанию.
- •82. Как передать функции переменное число параметров?
- •83. Зачем перегружают функции? Как компилятор определяет какую из перегруженных функций вызывают?
- •84. Как определяется шаблон функции? Опишите процесс конкретизации шаблона. Что есть явная специализация шаблона?
- •90. Как инициализировать, изменить поля класса, определенные как константные?
- •91. Опишите синтаксис определения метода класса вне описания класса.
- •92. Опишите синтаксис конструктора.
- •97. Можно ли построить класс без конструктора? Как в этом случае описать объекты класса?
- •99. Определите понятие «дружественная функция ».
- •100. Опишите синтаксис деструктора.Зачем виртуализировать деструктор? Можно ли наследовать деструктор?Можно ли явно вызвать деструктор?
- •101. Все ли операции могут быть перегружены? Можно ли перегрузить операции для базовых стандартных типов данных?
- •102. Зачем используют ключевое слово operator?
- •103. Укажите различные способы перегрузки операторов.
- •114. Определите понятие «абстрактный класс». Определите понятие «чистый виртуальный метод».
- •115. Опишите понятие «множественное наследование». Какие проблемы возникают при множествен-ном наследовании?
- •116. Опишите использование ключевых слов try, throw,catch.
- •117. Как определяется, какому блоку catch передается исключение для обработки?(стр.665)
- •118. Куда передается управление после обработки исключения?
- •119. Как организуется передача исключения в объемлющий блок?
82. Как передать функции переменное число параметров?
Можно с помощью параметров по умолчанию, как в вопросе выше.
А можно с помощью неуказанного кол-ва аргументов вида:
void func(int a …)
Но обрабатывается это как-то не очень хорошо с помощью макросов и рекомендуется не использовать. Так что Дубкову наверное можно сказать, чтобы сам такое писал.(с)
double f(double n, ...) //--заголовок с переменным числом параметров
{ double *p = &n; //--установились на начало списка параметров
double sum = 0, count = 0;
while (*p) //--пока аргумент не равен нулю
{ sum+=(*p); //--суммируем аргумент
p++; //--«перемещаемся на следующий аргумент
count++; //--считаем количество аргументов
}
return ((sum)?sum/count:0); } //--вычисляем среднее
83. Зачем перегружают функции? Как компилятор определяет какую из перегруженных функций вызывают?
Ф-ции перегружают, чтобы можно было выполнять одинаковые задачи для разных типов и при этом использовать только 1 имя ф-ции.
Компилятор различает ф-ции не только по имени, а ещё и по входным данным, так что перегруженные ф-ции для него вроде являются разными. Если конечно не возникает неоднозначностей.
Пример:
struct Distance
{ int feet;
float inches; };
void engldisp( Distance); //прототипы
void engldisp(float);
int main(){
…}
void engldisp( Distance dd) //параметр dd типа Distance
{ cout << dd/feet << “\’-“ << “\”; }
void engldisp( floar dd ) //параметр dd типа float
{ int feet = static_cast<int>(dd/12);
float inches = dd – feet*12;
cout << feet << “\’-“ << inches << “\”; }
84. Как определяется шаблон функции? Опишите процесс конкретизации шаблона. Что есть явная специализация шаблона?
Шаблоны позволяют использовать одни и те же функции или классы для обработки разных типов данных.
template <class Type>
Type min2( Type a, Type b ) {
return a < b ? a : b; }
Конкретизация
Шаблон функции описывает, как следует строить конкретные функции, если задано множество фактических типов или значений. Процесс конструирования называется конкретизацией шаблона. Выполняется он неявно, как побочный эффект вызова или взятия адреса шаблона функции. Например, в следующей программе min() конкретизируется дважды: один раз для массива из пяти элементов типа int, а другой – для массива из шести элементов типа double:
массива из шести элементов типа double:
// определение шаблона функции min()
// с параметром-типом Type и параметром-константой size
template <typename Type, int size>
Type min( Type (&r_array)[size] )
{ Type min_val = r_array[0];
for ( int i = 1; i < size; ++i )
if ( r_array[i] < min_val )
min_val = r_array[i];
return min_val;}
// size не задан -- ok
// size = число элементов в списке инициализации
int ia[] = { 10, 7, 14, 3, 25 };
double da[6] = { 10.2, 7.1, 14.5, 3.2, 25.0, 16.8 };
#include <iostream>
int main()
{ // конкретизация min() для массива из 5 элементов типа int
// подставляется Type => int, size => 5
int i = min( ia );
if ( i != 3 )
cout << "??oops: integer min() failed\n";
else cout << "!!ok: integer min() worked\n";
// конкретизация min() для массива из 6 элементов типа double
// подставляется Type => double, size => 6
double d = min( da );
if ( d != 3.2 )
cout << "??oops: double min() failed\n";
else cout << "!!ok: double min() worked\n";
return 0;}
Вызов
int i = min( ia );
приводит к конкретизации следующего экземпляра функции min(), в котором Type заменено на int, а size на 5:
int min( int (&r_array)[5] )
{ int min_val = r_array[0];
for ( int i = 1; i < 5; ++i )
if ( r_array[i] < min_val )
min_val = r_array[i];
return min_val;}
Аналогично вызов
double d = min( da );
конкретизирует экземпляр min(), в котором Type заменено на double, а size на 6.
Явное определение специализации – это такое определение, в котором за ключевым словом template следует пара угловых скобок <>, а за ними – определение специализированного шаблона. Здесь указывается имя шаблона, аргументы, для которых он специализируется, список параметров функции и ее тело.
#include <cstring>
// явная специализация для const char*: имеет приоритет над конкретизацией шаблона по обобщенному определению
typedef const char *PCC;
template<> PCC max< PCC >( PCC s1, PCC s2 ) {
return ( strcmp( s1, s2 ) > 0 ? s1 : s2 );
ИЛИ
template <class Ttype> тип имя_функции(список_параметров) {тело_функции}
Когда компилятор создает конкретную версию этой ф-ии (вместо Ttype подставляет нужный тип) создается ее конкретизация. Явная специализация шаблона-вручную перегруженная версия шаблона
85. Укажите особенности функции main.
Программа должны содержать ровно 1 ф-цию main. Выполнение программы начинается с вызова main и заканчивается после выхода из main. main может возвращать int (код ошибки) или void.
Также в main можно передать параметры из командной строки:
int main(int argc, char *argv[])
argc – кол-во строк
argv – массив строк
86. Опишите применение директивы #include.
Она используется, если требуется к программе подключить какие-то сторонние библиотеки, в которых содержатся необходимые методы, классы, константы.
87. Опишите применение директивы #define.
Константы можно определять с помощью директивы препроцессора #define. Директива #define не делает различий между числами и символьными строками. Наример, если в начале программы указана строчка
#define PI 3.14159
то идентификатор PI при компиляции будет заменен текстом 3.14159 везде, где он встречается.
88. Укажите способы задания комментариев.
//однострочный
/* текст коммент. */
89. Опишите синтаксис описания класса. Какой тип могут иметь поля класса?
class Name: public A, private B, …
{
private://можно и без этой метки
int a;
public:
Name();
~Name();
…
protected: …
}
В общем, сначала указывается имя, потом от кого наследуется, потом уже идёт описание класса.После метки public, protected, private идут соответственно поля/методы с такими же доступами. По умолчанию (без метки) доступ private. Желательно, чтобы у класса был конструктор/деструктор.
Поля класса могут вроде иметь любой тип, за исключением себя же и наследников данного класса.
