Конструкторы и деструкторы
Стр 1 из 7Следующая ⇒ Волкова И.А., Вылиток А.А., Карпов Л.Е.
Сборник Задач и упражнений по языку Си++
(учебное пособие для студентов II курса)
Москва – 2013
УДК 004.43(075.8) ББК
Печатается по решению Редакционно-издательского совета факультета вычислительной математики и кибернетики МГУ им. М. В. Ломоносова
Рецензенты: д.ф.-м.н. д.ф.-м.н. Волкова И. А., Вылиток А.А., Карпов Л. Е. Сборник задач и упражнений по языку Си++: Учебное пособие для студентов II курса. – М.: Издательский отдел факультета ВМК МГУ им. М.В.Ломоносова (лицензия ИД № 05899 от 24.09.2001); МАКС Пресс, 2013 – ХХХХХХ с. ISBN ISBN
B сборнике представлены задачи и упражнения по языку Си++, рекомендуемые студентам 2 курса для подготовки к коллоквиуму по основам объектно-ориентированного программирования в рамках курса «Системы программирования». Рассматриваемая версия языка Си++ соответствует стандарту ISO/IEC (1998). В сборнике собраны задачи на использование основных механизмов объектно-ориентированных языков программирования: инкапсуляции, наследования, полиморфизма. Значительная часть задач предлагалась студентам в письменных проверочных работах в 2008 – 2013 гг. Для студентов факультета ВМК в поддержку основного лекционного курса “Системы программирования”, а также для преподавателей, ведущих практические занятия по этому курсу. Авторы выражают благодарность преподавателям кафедры алгоритмических языков за участие в обсуждении и составлении задач.
ISBN
Ó Факультет вычислительной математики и кибернетики МГУ им. М.В.Ломоносова, 2013 Ó Волкова И.А., Вылиток А.А., Карпов Л.Е., 2013 I. Задачи и упражнения
Абстрактные типы данных (АТД). Классы. Конструкторы и деструкторы 1.1. Есть ли ошибки в приведенном фрагменте программы? Если есть, то объясните, в чем они заключаются.[1] Как изменить описание класса А, не вводя новые методы и не меняя f(), чтобы в f() не было ошибок? Что будет напечатано в результате работы функции f()? class A { int a, b; public: A (A & x) { a = x.a; b = x.b; cout << 1; } A (int a) { this -> a = a; b = a; cout << 2; } }; void f () { A x (1); A y; A z = A (2.5, 4); A s = 6; A w = z; x = z = w; }
1.2. Описать конструктор для некоторого класса А таким образом, чтобы были выполнены следующие условия: а) это единственный явно описанный конструктор класса А, б) справедливы следующие описания объектов класса А: A a; A b(1); A c(1, 2); A d (‘1’, 1);
1.3. Если есть ошибки в приведенном фрагменте программы, то объясните, в чем они заключаются, и вычеркните ошибочные конструкции. Что будет выдано в стандартный канал вывода при вызове функции main ()? a) class X { int i; double t; X(int k) { i = k; t = 0; cout << 1; } public: X(int k, double r = 0) { i = k; t = r; cout << 2; } X & operator = (X & a) { i = a.i; t = a.t; cout << 3; return * this; } X(const X & a) { i = a.i; t = a.t; cout << 4; } };
int main() { X a; X b(1); X c (2, 3.5); X d = c; X e (6.5, 3); c = d = e; return 0; }
a) class X { int i; double t; X() { i = 0; t = 1.0; cout << 1; } public: X(int k = 0, double r = 1.5) { i = k; t = r; cout << 2; } X(const X & a) { i = a.i; t = a.t; cout << 3; } };
int main() { X a; X b(1); X c (1.5, 2); X d = b; X e = 3; b = c = e; return 0; }
1.4. Описать класс А таким образом, чтобы все конструкции функции main () были верными, а на экран выдалось 100 300. int main () { A a1 (5), a2 = 3; a1 *= 10; a2 *= a1 *= 2; cout << a1.get() << a2.get() << endl; return 0; } 1.5. Описать класс B таким образом, чтобы все конструкции функции main были верными, а на экран выдалось 10 20 30. int main () { B b1, b2 = b1, b3 (b2); cout << b1.get() << b2.get() << cout b3.get () << endl; return 0; }
1.6. Описать класс C таким образом, чтобы все конструкции функции main были верными, а на экран выдалось 14 10 48.
int main () { C c1 (7), c2 = 5, c3 (c1 + c2); cout << c1.get() << c2.get() << c3.get () << endl; return 0; }
1.7. Описать класс А так, чтобы: - все конструкции функции main были верными, - явно в классе А можно описать не более одного конструктора, - на экран выдалось 15 60 7. Нельзя использовать исключения и любые функции досрочного завершения программы. int main () { A a1(5), a2 = 4, а3; a2 *= a1 *= 3; cout << a1.get() << ‘ ‘ << a2.get() << ‘ ‘ << a3.get() << endl; return 0; }
1.8. Описать класс В так, чтобы: - все конструкции функции main были верными, - класс В содержал только один явно описанный конструктор, - на экран выдалось 17 11 6. Нельзя использовать исключения и любые функции досрочного завершения программы. int main () { B b1 (1), b2(2,3), b3 (b1); b1 += b2 += b3; cout << b1.get() << ‘ ‘ << b2.get() << ‘ ‘ << b3.get () << endl; return 0; }
1.9. Описать класс С так, чтобы: - в main ошибочным было только описание объекта с2, - класс C содержал только один явно описанный конструктор, - после удаления описания с2 на экран выдалось 14 56. Нельзя использовать исключения и любые функции досрочного завершения программы. int main () { C c1(7), c2 = 5, c3(c1 + c1); cout << с1.get () << ‘ ‘ << с3.get () << endl; return 0; }
1.10. Что напечатает следующая программа?
class I { int i; public: I(): i(9) { cout << "sun" <<endl; } I(int a): i(a) { cout << "venus " << i << endl; } I(const I & other): i(other.i) { cout << "earth " << i << endl; } ~I() { cout << "moon" << endl; } int Get() { return i; } void operator += (const I & op) { i+=op.i; } };
void f(I & x, I y) { y += 1000; x += y; }
int main() { I i1; I i2(20); i2 += 400; f(i1, i2); cout << i1.Get() << i2.Get() << endl; return 0; }
1.11. Что напечатает следующая программа?
class I { int i; public: I(): i(6) { cout << "owl" << endl; } I(int a): i(a) { cout << "sheep " << i << endl; } I(const I & other): i(other.i) { cout << "horse " << i << endl; } ~I() { cout << "wolf" << endl; } int Get() { return i; } void operator*=(const I & op) { i*=op.i; } };
void f(I x, I & y) { x *= 1; y *= x; }
int main() { I i1; I i2(3); i1 *= 7; f(i1, i2); cout << i1.Get() << ‘ ‘ << i2.Get()<< endl; return 0; }
1.12. Что напечатает следующая программа?
class I { int i; public: I(): i(5) { cout << "fist" << endl; } I(int a): i(a) { cout << "lance " << i << endl; } I(const I & other): i(other.i) { cout << "dagger " << i << endl; } ~I() { cout << "pistole" << endl; } int Get() { return i; }
void operator+=(const I & op) { i+=op.i; } };
void f(I & x, I y) { y += 1000; x += y; }
int main() { I i1; I i2(30); i2 += 700; f(i1, i2); cout << i1.Get() << ‘ ‘ << i2.Get() << endl; return 0; }
1.13. Даны описания структуры, переменной и функции:
struct mystr { int a, b; }; int i = sizeof(mystr); int f(mystr s) { return 0; }
Дополните описание структуры mystr (не изменяя описание функции f) так, чтобы только описание f стало ошибочным.
1.14. Опишите структуру с именем smartstr, удовлетворяющую двум условиям: (1) можно создать объект типа smartstr; (2) нельзя создать массив элементов типа smartstr в динамической памяти.
1.15. Какие конструкторы и деструкторы и в каком порядке будут выполняться при работе следующего фрагмента программы: а) class A {}; class B: public A {}; class C: public B {}; int main(){ C c; A a = c; struct D { B b; D(): b(5){} } d; }
b) class A {}; class B: public A {}; class C: public B {}; int main(){ class D { B b; A a; public: D (): a(b){ } } d; C c; }
c) class A {}; class B {}; class C: public A, public B {}; int main(){ C c; class D { C c; B b; public: D(): b(c){} } d; }
1.16. Что будет выдано на печать при работе следующей программы?
struct S { int x; S (int n) { x = n; printf (" Cons "); } S (const S & a) { x = a.x; printf (" Copy "); } ~S () { printf ("Des "); } }; S f(S y) { y = S(3); return y; } int main () { S s (1); f (s); printf ("%d ", s.x); return 0; }
1.17. Что будет выдано на печать при работе следующей программы?
struct S { int x; S(int n) { x = n; printf(" Cons "); } S(const S & a) { x = a.x; printf(" Copy "); } ~S() { printf("Des "); } };
S f(S & y) { y = S(3); return y; }
int main () { S s(1); f (s); printf("%d ", s.x); return 0; }
1.18. Что будет выдано на печать при работе следующей программы?
struct S { int x; S(int n) { x = n; printf(" Cons "); } S(const S & a) { x = a.x; printf(" Copy "); } ~S() { printf("Des "); } };
S & f(S y, S & z) { y = S (3); return z; }
int main () { S s(1); f(s, s); printf("%d ", s.x); return 0; }
1.19. Внести добавления в описания заданных методов (не меняя вывод на экран!) структур B и D так, чтобы все конструкции main () были правильными, а на печать выдалось 5535324242.
struct B { float x; B (float a) { x = a; cout << 5; } ~B() { cout << 2; } }; struct D: B { D() { cout << 3; } ~D() { cout << 4; } };
int main () { B * p1 = new B (1), * p2 = new D[2]; delete p1; delete [ ] p2;
return 0; }
1.20. Внести добавления в описания заданных методов (не меняя вывод на экран!) структур B и D так, чтобы все конструкции main () были правильными, а на печать выдалось 11163343.
struct B { int x; B (int a) { x = a; cout << 1; } ~B () { cout << 3; } };
struct D: B { D (int d): B (d) { cout << 6; } ~D () { cout << 4; } };
int main () { B * p1 = new B [2], * p2 = new D (1); delete [ ] p1; delete p2; return 0; }
1.21. Внести добавления в описания заданных методов (не меняя вывод на экран!) структур B и D так, чтобы все конструкции main () были правильными, а на печать выдалось 776898.
struct B { int x; B() { x = 7; cout << 7; } ~B() { cout << 8; } };
struct D: B { D(int d) { x = d; cout << 6; } ~D() { cout << 9; } };
int main () { B * p1 = new B [1], * p2 = new D[1]; delete [ ] p1; delete [ ] p2; return 0; }
1.22. Есть ли ошибки в приведённом ниже фрагменте? Если да, объясните, в чём они заключаются.
a) int n; float f(float a, int t = 3, int d = n) { return a * (float) (t % d); }
b) float f(float a = 2.7, int t, int d = 8) { return sa * (float) (t % d); }
с) enum { myparam = 18 }; float f(float a, int t = myparam + 5, int d = t + 8) { return a * (float) (t % d); }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|