Абстрактные типы данных (АТД). Классы.
Конструкторы и деструкторы
1.1. Ошибочны 2, 3 и 4 описания объектов в функции f(). Исправить можно так: class A { int a, b; public: A (const A & x) { a = x.a; b = x.b; cout << 1; } A (int a = 0, int b = o) { this -> a = a; b = a; cout << 2; } };
На печать будет выдано: без оптимизации: 2221211 с оптимизацией: 22221
1.2. A (int a = 0, int b = 1) {…}
1.3. a) Есть ошибки в функции main (): X a; - нет конструктора умолчания X b(1); - - неоднозначность
На экран будет выдано: 24233 b) Есть ошибки в функции main (): X a; - - неоднозначность
На экран будет выдано: 22323 или 2232 – для оптимизируещего компилятора. 1.4. class A { int x; public: A (int y) { x = y; } int get () { return x; } int operator *= (int y) { return x = x*y; } }; 1.5. class B { int x; public: B () { x = 10; } B (const B & y) { x = y.x + 10; } int get () { return x; } }; 1.6. class C { int x; public: C (int y) { x = 2 * y; } int get () { return x; } C operator + (C c) { C t (x + c.x); return t; } };
1.7. class A { int x; public: A (int y = 7) { x = y; } int get () { return x; } int operator *= (int y) { return x *= y; } }; 1.8. class B { int x, y; public: B (int a, int b = 5) { x = a; y = b; } int get () { return x + y; } B & operator =+ (B & b){ x += b.x; y += b.y; return * this;} }; 1.9. class C { int x; public: explicit C (int y) { x = 2 * y; } int get () { return x; } C operator + (C c) { C t (x + c.x); return t; } }; 1.10. sun venus 20 venus 400 moon earth 420 venus 1000 moon moon 1429 420 moon moon 1.11. owl sheep 3 sheep 7 wolf horse 42 sheep 1 wolf wolf 42 126 wolf wolf 1.12. fist lance 30 lance 700 pistole dagger 730 lance 1000 pistole pistole 1735 730 pistole pistole 1.13. Необходимо убрать в приватную часть конструктор копирования, например: struct mystr { int a, b; private: mystr(const mystr & s) {} }; 1.14. Необходимо, чтобы для этой структуры отсутствовал конструктор умолчания. Достаточно описать структуру, содержащую конструктор с одним или более параметром и не содержащую конструктор без параметров, например:
struct smartstr {
int a, b; smartstr(int x): a(x), b(x) {} }; 1.15. a) A(), B(), C(), A(const A&), A(), B(), D(), ~D(), ~B(), ~A(), ~A(), ~C(), ~B(), ~A()
b) A(), B(), A(const A&), D(), A(), B(), C(), ~C(), ~B(), ~A(), ~D(), ~A(), ~B(), ~A()
c) A(), B(), C(), A(), B(), C(), B(const B&), D(), ~D(), ~B(), ~C(), ~B(), ~A(), ~C(), ~B(), ~A()
1.16. Cons Copy Cons Des Copy Des Des 1 Des
1.17. Cons Cons Des Copy Des 3 Des
1.18. Cons Copy Cons Des Des 1 Des 1.19. 1) перед деструктором базового класса добавить virtual. 2) добавить либо В (float a = 0), либо D (): B (0) {...} 1.20. 1) перед деструктором базового класса добавить virtual. 2) добавить В (int a = 0) {...} 1.21. 1) перед деструктором базового класса добавить virtual. 2) добавить D (int d = 0) {...} 1.22. a) Параметры по умолчанию должны представлять собой константы време ни компиляции, так что последний параметр функции f описан с ошибкой. Других ошибок нет.
b) если некоторый параметр функции допускает умолчание, то все остальные параметры справа от него тоже должны допускать умолчание. В данном случае это правило нарушено для параметра t.
c) Параметры по умолчанию должны представлять собой константы времени компиляции, так что последний параметр функции f описан с ошибкой. Других ошибок нет; в частности, описание второго параметра (t) ошибки не содержит.
Перегрузка операций. Перегрузка функций 2.1. Необходимо убрать в приватную часть операцию присваивания от аргумента типа <<ссылка на Cls>>, например:
class Cls { void operator= (const Cls &) {} public: Cls () {} };
2.2 a) void g (double a, int b = 0); void g (int, const char * = 0); Возможны варианты с double, char...
b) void f (const char * a = 0); void f (int a, int b = 0); Возможны варианты с char...
c) void f (const char *, int); void f (int, const char *);
d) void f (int, const char *); либо void f (X, const char *); void f (const char *);
e) void f (double d = 0, const char * s = 0); void f (const char *); либо void f (const char *, int i = 0); 2.3. a) f(); // f(int), (a) на этапе выбора функций, // подходящих по кол-ву параметров; f(s); // f(int), (б) целочисленное расширение f(f); // f(double),(б) вещественное расширение f(b); // f(int), (б) целочисленное расширение
f(A); // f(int), (б) целочисленное расширение
b) f(); // (а) неоднозначность определения числа параметров f(4); // (в) неоднозначность при стандартном преобразовании f(f); // f(double), (б) вещественное расширение f(d); // f(double), (а) точное отождествление f(ld);// f(long double),(а) точное отождествление
c) f(s); // f(int), (б) целочисленное расширение f(i); // f(int), (а) точное отождествление f(b); // f(int), (б) целочисленное расширение f(f); // (в) неоднозначность при стандартном преобразовании f(d); // (в) неоднозначность при стандартном преобразовании
Наследование. Видимость и доступность имен 3.1. a) void B::g() { f(); // ошибка, эта f не видна f(1); // B::f(1); f(5, 1); // ошибка эта f не видна x = 2; // ошибка, так как int x private в базовом классе }
int main () { B b; // A(), B() f(5); //ошибка, эта f не видна f(‘+’, 6); //::f(‘+’, 6); b = ret (b, b); // A(const A &), B(const B &) return 0; } Будут вызваны следующие конструкторы и деструкторы: A(), B(), A(const A &), B(const B &), ~B(), ~A(), ~B(), ~A().
b) void B::g() { f(1.2); // B::f f(); // ошибка эта f не видна a = 2; // A::a = 2 }
int main () { B d; f(); //ошибка f(6); //::f empty (d, d); return 0; } Будут вызваны следующие конструкторы и деструкторы:
A(), B(), A(const A &), B(const B &), ~B(), ~A(), ~B(), ~A().
c) void B::g() { f(); // ошибка, эта f не видна f(0); // B::f(0); f(5.3, 1); // ошибка эта f не видна x = 1; // ошибка, так как int x private в базовом классе }
int main () { B b; f(2); // ошибка, эта f не видна f(3, 'a'); //::f(3, a); return 0; } Будут вызваны следующие конструкторы и деструкторы: A(), B(), ~B(), ~A()
d) void B::g() { f(r); // B::f f(); // ошибка эта f не видна a = 2; // BBase::a = 2 } int main () { B d; f(); //ошибка, неоднозначный выбор f f(6); //::f return 0; } Будут вызваны следующие конструкторы и деструкторы: BBase(), B(), ~B(), ~BBase()
e) void B::g() { f(); // ошибка, эта f не видна f(1); // ошибка, эта f не видна f(-1, 1); // ошибка, неоднозначный выбор f x = 2; // ошибка, так как int x private в базовом классе }
int main () { B b; f(5); //::f(5); f(+, 6); // ошибка, эта f не видна return 0; } Будут вызваны следующие конструкторы и деструкторы: T(), B(), ~B(), ~T() 3.2. а) C::x = A:: f (); C::f (3); C::x = :: f (4, 5); C::x = 6;
c. A:: f (); c.C::f (7); ::x =::f (‘8’, 9); Подчеркнуты исправляющие (обязательные) расширения. Будут вызваны следующие конструкторы и деструкторы: A(), B(), C(), B(const B &), A(const A &), ~A(), ~B(), ~C(), ~B(), ~A()
b) x = A:: f (); x = B:: f (5); x = B:: f (6, 6); x = B:: f (5); x = a. A:: f ();
x = a.B:: f (7); return a.B::g (& a, & a); Подчеркнуты исправляющие (обязательные) расширения. Будут вызваны следующие конструкторы и деструкторы: A(), B(), A(), B(), A(const A &), C(), ~C(), ~A(), ~B(), ~A(), ~B(), ~A()
c) C::x = A:: f (); C::f (3); C::x = :: f (4, 5); C::x = 6; //main() c. A:: f (); c.C::f (7); ::x =::f (‘8’, 9); Подчеркнуты исправляющие (обязательные) расширения. Будут вызваны следующие конструкторы и деструкторы: A(), B(), C(), B(const B &), A(const A &), ~A(), ~B(), ~C(), ~B(), ~A(). d) x = A:: f(); // A::f() x = B:: f(5); // B::f(5) x = B:: f(6, 6); // B::f(6, 6) x = B:: f(5); // B::f(5) //main() x = a. A:: f(); // A::f() x = a.B:: f(7); // B::f(7) return a.B::g(& a, & a); Подчеркнуты исправляющие (обязательные) расширения. Будут вызваны следующие конструкторы и деструкторы: A(), B(), A(const A &), C(), ~C(), ~A(), ~B(), ~A() e) Ошибочны 2 оператора, которые можно исправить: x = c. A:: f (); x = c. A:: f (x); // x = c. B:: f (x); Будут вызваны следующие конструкторы и деструкторы: A(), B(), A(), B(), C(), A(const A&), A(), B(), D(), ~D(), ~B(), ~A(), ~A(), ~C(), ~B(), ~A(), ~B(), ~A()
f) Ошибочны 2 оператора, которые можно исправить: x = c. A:: f (); x = c. A:: f (x); Будут вызваны следующие конструкторы и деструкторы: A(), B(), A(), B(), C(), A(), B(), A(const A&), D(), ~D(), ~A(), ~B(), ~A(), ~C(), ~B(), ~A(), ~B(), ~A() 3.3. Требуется уточнить обращения к полю “m” с помощью операций разрешения области видимости “::” для класса “B” либо для “С”, например, так: fA. C:: m = 0; return *((* f).e = & fA. C:: m); Либо во всех описаниях производных классов вставить указание виртуального наследования (всего 4 поправки, из которых исправления в классах “B” и “С” при таком подходе – обязательны):
class B: virtual public A { public: int * p; }; class C: virtual public A { public: int * c; }; 3.4. 1. Необходимо заменить вид наследования класса “S” на открытый, чтобы поле “s” стало доступным в классе “U”: class T: public S { public: int t; void tp (int ti) { t = ti; s = ti; } }; 2. Необходимо дополнительно заменить вид наследования класса “T” на открытый, чтобы стали возможными преобразования указателей в процедуре “g()”:
class U: public T { public: int u; void up (int ui) { u = ui; t = ti; s = ti; } };
3. Открытости наследования можно добиться, заменяя в наследующем классе слово “ class ” словом “ struct ”. 3.5. 1. Чтобы преобразование из класса “W” в функции “h()” в класс “Z” стало воз- можным, это преобразование надо исправить:
pz = (Z *)(X *) (new W); 2. Дополнительно необходимо сделать открытым вид наследования класса “W” классом “X” и класса “X” классом “Z”:
class X: public W {... }; class Z: public X,Y {... };
3. Необходимо уточнить область видимости поля “w” в теле функции “h()”:
(*pz). X:: w=& hi;
4. Открытости наследования можно добиться, заменяя в наследующем классе слово “ class ” словом “ struct ”.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|