Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Конструкторы и деструкторы




Волкова И.А., Вылиток А.А., Карпов Л.Е.

 

 

Сборник

Задач и упражнений

по языку Си++

 

 

(учебное пособие для студентов 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...