Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы_экзамен_информатика.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
153.09 Кб
Скачать

4. Классы, наследование и дружественные конструкции

1. Определите класс для представления банковского счета. Данные-члены должны включать имя вкладчика, номер счета (используйте строку) и баланс. Функции-члены должны позволять следующее:

• создание объекта и его инициализация;

• отображение имени вкладчика, номера счета и баланса;

• добавление на счет суммы денег, переданной в аргументе;

• снятие суммы денег, переданной в аргументе.

Приведите объявление класса без реализации методов.

2. Определите класс для представления банковского счета. Данные-члены должны включать имя вкладчика, номер счета (используйте строку) и баланс. Функции-члены должны позволять следующее:

• создание объекта и его инициализация;

• отображение имени вкладчика, номера счета и баланса;

• добавление на счет суммы денег, переданной в аргументе;

• снятие суммы денег, переданной в аргументе.

Напишите код конструктора для этого класса.

3. Модифицируйте определение класса Stock

#include <string>

class Stock

{

private:

std::string company;

int shares;

double share val;

double total_val;

void set_tot() {total_val = shares * share_val;}

public:

Stock();

Stock(const std::string & со, long n = 0, double pr = 0.0);

~Stock();

void buy(long num, double price);

void sell(long num, double price);

void update(double price);

void show() const;

const Stock & topval(const Stock & s) const;

};

так, чтобы он имел функции-члены, которые возвращают значения индивидуальных данных-членов. Член, который возвращает наименование компании, не должен давать возможности изменять массив.

4. Приведено определение класса:

class Stonewt

{

private:

enum {Lbs_per_stn = 14}; // фунтов на стоун

int stone; // полных стоунов

double pds_left; // дробное число фунтов

double pounds; // общий вес в фунтах

public:

Stonewt(double lbs); // конструктор для значения в фунтах

Stonewt(int stn, double lbs); // конструктор для значения в стоунах и фунтах

Stonewt(); // конструктор по умолчанию

~Stonewt();

void show_lbs() const; // отображение веса в формате фунтов

void show_stn() const; // отображение веса в формате стоунов

};

Воспользуйтесь функцией-членом для перегрузки операции умножения в классе Stonewt; определите операцию умножения членов данных на значение типа double. Имейте в виду, что нужно будет позаботиться о представлении "стоун-фунт". То есть удвоение 10 стоунов и 8 фунтов должно давать 21 стоун и 2 фунта.

5. Приведено определение класса:

class Stonewt

{

private:

enum {Lbs_per_stn = 14}; // фунтов на стоун

int stone; // полных стоунов

double pds_left; // дробное число фунтов

double pounds; // общий вес в фунтах

public:

Stonewt(double lbs); // конструктор для значения в фунтах

Stonewt(int stn, double lbs); // конструктор для значения в стоунах и фунтах

Stonewt(); // конструктор по умолчанию

~Stonewt();

void show_lbs() const; // отображение веса в формате фунтов

void show_stn() const; // отображение веса в формате стоунов

};

Воспользуйтесь дружественной функцией для перегрузки операции умножения в классе Stonewt; определите операцию умножения значения double на значение Stone.

6. Пусть класс String содержит следующие закрытые члены:

class String

{

private:

char * str; // указывает на строку, распределенную операцией new

int len; // хранит длину строки

};

а. Что неправильно в следующем конструкторе по умолчанию?

String::String() {}

б. Что неправильно в следующем конструкторе?

String::String(const char * s)

{

str = s;

len = strlen(s);

}

в. Что неправильно в следующем конструкторе?

String::String(const char * s)

{

strcpy(str, s);

len = strlen(s);

}

7. Найдите и исправьте ошибки в следующем объявлении класса:

class nifty

{

char personality[];

int talents;

nifty();

nifty(char * s);

ostream & operator<<(ostream & os, nifty & n);

}

nifty:nifty()

{

personality = NULL;

talents = 0;

}

nifty:nifty(char * s)

{

personality = new char [strlen (s)];

personality = s;

talents = 0;

}

ostream & nifty:operator<<(ostream & os, nifty & n)

{

os << n;

}

8. Имеется следующее объявление класса:

class Golfer

{

private:

char * fullname; // указывает на строку, содержащую имя игрока в гольф

int games; // хранит количество сыгранных игр

int * scores; // указывает на первый элемент массива счетов игр

public:

Golfer();

Golfer(const char * name, int g = 0);

Golfer(const Golfer & g); // Создает пустой динамический массив из g элементов, если g > 0

~Golfer();

};

а. Какие методы класса будут вызываться следующими операторами?

Golfer nancy; // #1

Golfer lulu("Little Lulu"); // #2

Golfer roy("Roy Hobbs", 12); // #3

Golfer * par = new Golfer; // #4

Golfer next = lulu; // #5

Golfer hazzard = "Weed Thwacker"; // #6

*par = nancy; // #7

nancy = "Nancy Putter"; // #8

б. Ясно, что классу требуется больше методов для того, чтобы он был действительно полезным. Какой дополнительный метод нужен для защиты данных от разрушения?

9. Создайте исходный базовый класс building для хранения числа этажей и комнат в здании, а также общую площадь комнат. Создайте производный класс house, который наследует класс building и хранит число ванных комнат и число спален. Кроме этого создайте производный класс office, который наследует класс building и хранит число огнетушителей и телефонов.

10. Предположим, что Corporation - базовый класс, a PublicCorporation - производный. Допустим также, что в каждом из этих классов определен метод head(), ph является указателем на тип Corporation, а переменной ph присвоен адрес объекта PublicCorporation. Как интерпретируется ph->head (), если в базовом классе метод head() определен как:

а. обычный не виртуальный метод;

б. виртуальный метод.

11. Есть ли ошибки в следующем коде, и если есть, то какие?

class Kitchen

{

private:

double kit_sq_ft;

public:

Kitchen() {kit_sq_ft = 0.0;}

virtual double area() const {return kit_sq_ft * kit_sq_ft;}

};

class House:public Kitchen

{

private:

double all_sq_ft;

public:

House() {all_sq_ft += kit_sq_ft;}

double area(const char *s) const {cout << s; return all_sq_ft;}

};

12. Для каждого набора классов из столбца А укажите, какое наследование - общедоступное или закрытое - лучше подходит для столбца Б.

А

Б

class Bear (Медведь)

class PolarBear (Белый медведь)

class Kitchen (Кухня)

class Home (Дом)

class Person (Человек)

class Programmer (Программист)

class Person (Человек)

class HorseAndJockey (Лошадь и жокей)

class Person, class Automobile (Человек, Автомобиль)

class Drive (Поездка)

13. Пусть имеются следующие определения:

class Frabjous {

private:

char fab[20];

public:

Frabjous(const char * s = "C++") : fab(s) { }

virtual void tell() {cout << fab;}

};

class Gloam {

private:

int glip;

Frabjous fb;

public:

Gloam(int g = 0, const char * s = "C++");

Gloam(int g, const Frabjous & f);

void tell();

};

Напишите определения для трех методов класса Gloam, если функция tell() из класса Gloam выводит значения glip и fb.

14. Пусть имеются следующие определения:

class Frabjous {

private:

char fab[20];

public:

Frabjous(const char * s = "C++") : fab(s) { }

virtual void tell() { cout << fab; }

};

class Gloam : private Frabjous{

private:

int glip;

public:

Gloam(int g = 0, const char * s = "C++");

Gloam(int g, const Frabjous & f);

void tell();

};

Напишите определения для трех методов класса Gloam, если функция tell() из класса Gloam выводит значения glip и fb.

15. Что неверно в следующих попытках создания дружественных конструкций:

а. class snap {

friend clasp;

};

class clasp {...};

б. class cuff {

public:

void snip(muff &) {...}

};

class muff {

friend void cuff::snip(muff &);

};

в. class muff {

friend void cuff::snip(muff &);

};

class cuff {

public:

void snip(muff &) { ... }

};

16. Какие проблемы могут возникнуть в следующем объявлении вложенного класса?

class Ribs

{

private:

class Sauce

{

int soy;

int sugar;

public:

Sauce(int s1, int s2) : soy(s1), sugar(s2) { }

};

};

17. Пусть имеется следующее объявление класса:

class RQ1

{

private:

char * st; // указатель на строку в стиле С

public:

RQ1() { st = new char [1]; strcpy(st, " ") ; }

RQ1(const char * s) {st = new char [strlen(s) + 1]; strcpy(st, s);}

RQ1(const RQ1 & rq) {st = new char [strlen(rq.st) + 1]; strcpy(st, rq.st);}

~RQ1() {delete [] st};

RQ & operator= (const RQ & rq);

// Другие операторы

};

Преобразуйте его в объявление, использующее объект string. Какие методы больше не нуждаются в явных определениях?

18. Дан следующий фрагмент программы, впишите детали, как указано в комментариях:

#include <iostream>

using namespace std;

class planet {

protected:

double distance; // расстояние в милях от Солнца

int revolve; // полный оборот в днях

public:

planet(double d, int r) { distance = d; revolve = r; }

};

class earth: public planet {

double circumference; // окружность орбиты

public:

/* Создайте конструктор earth (double d, int r). Он должен передавать классу planet расстояние и число оборотов, а также рассчитывать окружность орбиты */

/* Создайте функцию show() для вывода информации на экран */

};

int main()

{

earth ob(93000000, 365);

ob.show();

return 0;

}

19. Используя следующую иерархию классов, создайте конструктор класса С так, чтобы он инициализировал переменную k и передавал аргументы конструкторам А() и В().

#include <iostream>

using namespace std;

class A

{

int i;

public:

A(int a) { i = a; }

};

class В

{

int j;

public:

В(int a) { j = a; }

};

class C: public A, public В

{

int k;

public:

/* Создайте такой конструктор С(), чтобы он инициализировал переменную k и передавал аргументы конструкторам А() и В() */

};

20. Исправьте следующую программу:

#include <iostream>

using namespace std;

// Базовый класс для автомобилей разных типов

class vehicle

{

int num_wheels;

int range;

public:

vehicle(int w, int r) { num_wheels = w; range = r; }

void showv()

{

cout << "Число колес" << num_wheels << '\n';

cout <<"Грузоподъемность" << range << '\n';

}

};

enum motor {gas, electric, diesel};

class motorized: public vehicle

{

enum motor mtr;

public:

motorized(enum motor m, int w, int r): vehicle(w, r) { mtr = m; }

void showm()

{

cout <<"Мотор:";

switch(mtr)

{

case gas: cout << "На газе\n";

break;

case electric: cout << "На электроэнергии\n";

break;

case diesel: cout << "Дизельный\n";

break;

}

}

};

class road_use: public vehicle

{

int passengers;

public:

road_use(int p, int w, int r): vehicle(w, r) { passengers = p; }

void showr() { cout << "Пассажироемкость" << passengers << '\n' }

};

enum steering {power, rack_pinion, manual};

class car: public motorized, public road_use

{

enum steering strng;

public:

car(enum steering s, enum motor m, int w, int r, int p) : road use(p, w, r), motorized(m, w, r), vehicle(w, r)

{ strng = s; }

void show()

{

showv(); showr(); showm();

cout << "Управление:";

switch(strng)

{

case power: cout <<"Силовой привод\п";

break;

case rack_pinion: cout << "Механический привод\п";

break;

case manual: cout << "Ручной привод\п";

break;

}

}

};

int main()

{

car с(power, gas, 4, 500, 5);

c.show();

return 0;

}