И.А. Волкова, А.А. Вылиток, Л.Е. Карпов - Сборник задач и упражнений по языку Си++, страница 7
Описание файла
PDF-файл из архива "И.А. Волкова, А.А. Вылиток, Л.Е. Карпов - Сборник задач и упражнений по языку Си++", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 7 страницы из PDF
Даны описания:struct Value_t { bool Signif;int Value;};typedef vector< Value_t> B;typedef list< B::size_type> T;// значимость элемента (true – да)// значение элемента вектора54Описать функцию g (), которая по заданному вектору типа B и соответствующемуему списку типа T, просматривая список от конца к началу, вычисляет сумму значимых целочисленных полей элементов вектора, и возвращает это значение, одновременно выдавая в выходной поток значения всех целочисленных полей элементов вектора, сопровождаемые их значимостью.II.Ответы и решения1.
Абстрактные типы данных (АТД). Классы.Конструкторы и деструкторы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.