TString TString::operator--()
{for(int i = 0; i < this->Length(); i++)
{ for (int j = 0; j < 59; j++) if (s[i] == upper[j]) s[i]=lower[j]; }
return *this;
}
TString t ("МамамылаМилу"); cout << t << endl;
++t; cout << t << endl;
--t; cout << t << endl;
TString b = "abCDefGH"; cout << b << endl;
++b; cout << b << endl;
--b; cout << b << endl;
56.Какие операции не рекомендуется перегружать как методы класса? Почему? Перегрузка операции сложения. Пример.
57.Перегрузка операции индексирования. Сколько операндов имеет операция индексирования []? Какой вид результата должна возвращать эта операция?
58.Указать верные объявления перегруженных операторов присваивания:
Proba& operator = (Proba& a);
Proba operator = (Proba& a);
59.Перегрузка операций ввода/вывода.
60. *Объясните значение для перегрузки операторов (и приведите примеры использования) возможности возврата из функции ссылки.
61. *Укажите ошибки (если они есть) и прокомментируйте последовательность операторов:
double *p = (double*)malloc(sizeof(double));
double& ref = *p;
ref = 1.0;
free(p);
ref = 1.5;
62.Что происходит в следующих выражениях, содержащих new и delete?
class Exercise {
public:
Exercise();
~Exercise();
void *operator new[]( size_t );
void operator delete[]( void * );
};
Exercise *ps = new Exercise[20];
delete[] ps;
Измените эти выражения так, чтобы вызывались глобальные операторы new() и delete().
63.Выполнение каких инструкций предполагает выделение памяти с помощью оператора new():
Point *ptrP = new Point(10, 20);
64.Объясните, какие из приведенных инициализаций ошибочны:
class iStack {
public:
iStack( int capacity )
: _stack( capacity ), _top( 0 ) {}
private:
int _top;
vector< int> _stack;
};
(a) iStack *ps = new iStack(20);
(b) iStack *ps2 = new const iStack(15);
(c) iStack *ps3 = new iStack[ 100 ];
65.Определить класс-вектор с перегрузкой операторов ввода/вывода, присваивания, сложения.
66.*Что будет выведено в результате выполнения следующего кода и почему:
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;
}