И.А. Волкова, А.А. Вылиток, Л.Е. Карпов - Сборник задач и упражнений по языку Си++ (1119397), страница 7
Текст из файла (страница 7)
Абстрактные типы данных (АТД). Классы.Конструкторы и деструкторы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;}};На печать будет выдано:без оптимизации:с оптимизацией:1.2.1.4.A ( int a = 0,222121122221int b = 1 ) {…}class A {int x;public:A ( int y ) { x = y; }int get () { return x; }int operator *= ( int y ) { return};x =1.16. Cons Copy Cons Des Copy Des Des 1 Des1.17. Cons Cons Des Copy Des 3 Des1.18. Cons Copy Cons Des Des 1 Des55x*y; }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) {...}2. Перегрузка операций. Перегрузка функций2.1. Необходимо убрать в приватную часть операцию присваивания от аргумента типа«ссылка на Cls», например:class Cls {void operator= (const Cls &) {}public:Cls () {}};2.2a)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...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(s);f(f);f(b);f(A);////////////f(int),(a) на этапе выбора функций,подходящих по кол-ву параметров;f(int),(б) целочисленное расширениеf(double),(б) вещественное расширениеf(int),(б) целочисленное расширениеf(int),(б) целочисленное расширениеb)f(); //(а) неоднозначность определения числа параметровf(4); //(в) неоднозначность при стандартном преобразованииf(f); // f(double), (б) вещественное расширениеf(d); // f(double), (а) точное отождествлениеf(ld);// f(long double),(а) точное отождествлениеc)f(s);f(i);f(b);f(f);f(d);//////////f(int),(б) целочисленное расширениеf(int),(а) точное отождествлениеf(int),(б) целочисленное расширение(в) неоднозначность при стандартном преобразовании(в) неоднозначность при стандартном преобразовании56Наследование.
Видимость и доступность имен3.3.1.a) void B::g() {f();f(1);f(5 , 1);x = 2;////////ошибка, эта f не виднаB::f(1);ошибка эта f не виднаошибка, так как 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(),~A().b) void B::g() {f(1.2);f();a = 2;// B::f// ошибка эта f не видна// A::a = 2}int main () {B d;f();f(6);emptyreturn}//ошибка//::f(d, d);0;Будут вызваны следующие конструкторы и деструкторы:A(),B(),A(const A &),B(const B &), ~B(),~A(),3.2.а)C::xC::fC::xC::x= A::f ();(3);= ::f (4, 5);= 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 =x =x =A:: f ();B:: f (5);B:: f (6, 6);57x =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().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.5.Чтобы преобразование из класса W в функции h () в класс Z стало возможным, это преобразование надо исправить:1.pz = (Z *)(X *)(new W);2.
Дополнительно необходимо сделать открытым вид наследования класса Wклассом X и класса X классом Z:class X: public W3.{ ... };class Z: public X,Y {... };Необходимо уточнить область видимости поля w в теле функции h ():(*pz).X::w=& hi;4. Открытости наследования можно добиться, заменяя в наследующем классеслово class словом struct.584. Виртуальные функции. Абстрактные классы4.1.1. Имеется иерархия классов, хотя бы из двух классов — базового и производного.2. В базовом классе функция объявлена с ключевым словом virtual.3.
В производном классе есть функция с таким же именем, с таким же списком параметров (количество, типы и порядок параметров совпадают) и с таким же типомвозвращаемого значения.4. Вызов функции производного класса осуществляется через указатель на объектбазового класса (или с помощью ссылки на объект базового класса) без указаниясамого объекта и уточнения с помощью операции разрешения области видимости.class B{ public: virtual void print (); };class P: public B { public:void print (); };void B::print () { ...
}void P::print () { ... }B * ps = new P; ...4.2.4.4.ps -> print ();int main( ){X a;Z b;X * p = &b;p -> g(1.5); // печатаетсяZ::t//Z::h//Z::gp -> h();//печатаетсяX::t//X::hp -> t(5); // ошибка, X::t – без параметров}int main( ){K k; P p;K *t = &p;t -> f (0.7); // печатаетсяt -> g ();// печатается//t -> h(); //печатается////K::fK::fK::gP::fP::gP::h}4.6. Ошибок нет.Будет выдано в поток: D::hD::gD::h,2D::hD::f,2D::hD::hD::h,3D::h,14.7.
Ошибочным является вызов p->h (2) (Функция h (int) из производного класса незамещает h () базового класса, так как имеет отличающийся набор параметров).Будет выдано в поток: U::h,1U::f,1T::hT::gT::h4.10. dogsheepresult = (33 ; 4)horsecat594.11. При передаче переменной типа А в функцию g () по значению должен быть создан объект типа А, а это невозможно, поскольку структура содержит чистую виртуальную функцию.4.12. Полем структуры А является объект типа S, а это невозможно, поскольку структура S содержит чистую виртуальную функцию.4.13. При передаче переменной типа B в функцию g () по значению должен быть созданобъект типа B, а это невозможно, поскольку структура содержит чистую виртуальнуюфункцию.4.14.
f (int) from B101010104.15. add_st (K*) from K5554.16. g ( ) from T7775. Аппарат исключений5.1. Будет напечатано:12 ¬ 9 ¬ 2 ¬ 4 ¬ 6 ¬ 115.6.4 ¬ 11 ¬ 9 ¬ 12 ¬5.7.catelephant 915.8.lancearche 615.9.planeboat 522 ¬ 5 ¬ 10 ¬ 6 ¬ 8 ¬ 5 ¬ 146. Константные и статические члены класса.6.1. Исправления:class A {public:static int y;void f() const {cout << "f" << endl;}};6.3. a)1.Заменить слово class словом struct, либо вставить после открывающей фигурнойскобки определения класса слово public:.2.Cделать метод g () статическим.60b)1.Заменить слово class словом struct, либо вставить после открывающей фигурнойскобки определения класса слово public:.2.В определениях методов f () и g () вставить после пустого списка формальныхпараметров слово const.6.4.a)b)class A {public:static int x;void get_0() const {return;}};class A {public:static const char a;static void f(){}};6.5.
Ошибочными являются указания на то, что статические методы f () вызывают нестатические методы. Надо исключить в методах f () вызовы методов h ():На печать будет выдано:B::f,0A::f,1A::gA::gA::h,2A::f,37.Динамическая идентификация и приведение типов7.1.Ошибочные конструкции переведены в примечания. Лишние операции динамического приведения типа заменены операциями присваивания.k = s;базовому// s = dynamic_cast// l = dynamic_castm = s;базовому// p = dynamic_castq = dynamic_cast <Qr = dynamic_cast <R// s = dynamic_cast7.2.//Приведениеуказателяк<S *>(k);// Тип К – не полиморфный<L *>(k);// Тип К – не полиморфный//Приведениепроизводногоуказателяк<P *>(l);*>(m);*>(q);<S *>(p);производного// Тип L – не полиморфный// Тип P – не полиморфныйВариант исправления функции f9 () с использованием операции typeid (возможентакже вариант исправления с использованием операции dynamic_cast):void f9 (B & b, D{D * pd = (n >if (typeid (*strcpy (pd ->}& d, int n)0) ? & d : (D *) & b;pd) == typeid (d))y, “one_variant\n”);}617.6.
Вариант написания функции f ():B * f (A * p){B* pb = dynamic_cast<B *> (p);if (pb) return pb;else exit (0);}8. Шаблоны8.2.В качестве параметра шаблона можно использовать либо тип (что показываетсяслужебными словами class, typename, но не struct), либо параметр целочисленного, перечислимого, указательного, ссылочного типа, либо типа «указатель нафункцию-член». Типы double, float, myclass, mystruct, struct к таковым не относятся. Ошибки в строках:templatetemplatetemplatetemplatetemplate<double f> void funcA (double d = f) { /*...*/ }<float f> class A { /*...*/ };<myclass c> class E { /*...*/ };<mystruct a> void funcE (mystruct *p = &a) { /*...*/ }<struct mystruct> void funcF (mystruct *p = 0) { /*...*/ }8.4.
Будет напечатано:z = 2.8k = 12z = 1.5z = 2.8s3 = abftВыбор сделан!9. STL9.15.void f (const int x, const list <int> & l){list<int>::const_iterator p = l.begin ();while (p != l.end ())if (* p == x){printf (“Yes\n”);return;}printf (“No\n”);}62III. Литература1. Standard for the C++ Programming Language ISO/IEC 14882, 1998.2. Страуструп Б.
Язык программирования C++. Специальное изд./Пер. сангл. — М.: «Бином», 2005.3. Волкова И.А, Иванов А.В., Карпов Л.Е. Основы объектноориентированного программирования. Язык программирования Си++. —М.: МГУ, МАКС Пресс, 2011.–112с.63СОДЕРЖАНИЕI.II.Задачи и упражнения1. Абстрактные типы данных (АТД). КлассыКонструкторы и деструкторы2.
Перегрузка операций. Перегрузка функций3. Наследование. Видимость и доступность имен4. Виртуальные функции. Абстрактные классы5. Аппарат исключений6. Константные и статические члены класса7. Динамическая идентификация и приведение типов8. Шаблоны9. STL11113222939454750Ответы и решения1. Абстрактные типы данных (АТД). КлассыКонструкторы и деструкторы2.
Перегрузка операций. Перегрузка функций3. Наследование. Видимость и доступность имен4. Виртуальные функции. Абстрактные классы5. Аппарат исключений6. Константные и статические члены класса7. Динамическая идентификация и приведение типов8. Шаблоны9. STL555657596060616262III. Литература6364.