Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лафоре Р. - Объектно-ориентированное программир...doc
Скачиваний:
50
Добавлен:
01.04.2025
Размер:
40.77 Mб
Скачать

Int operator*(Int i2) // умножение

{ return checkit(long double(i)*long double(i2)); }

Int operator/(Int i2) // деление

{ return checkit(long double(i)/long double(i2)); }

Int checkit(long double answer) // проверка

// результатов

{

if(answer > 2147483647.0L || answer <-2147483647.0L)

{ cout << "\nОшибка переполнения\n ";exit(1); }

return Int(int(answer));

}

};

///////////////////////////////////////////////////////////

int main()

{

Int alpha = 20;

Int beta = 7;

Int delta, gamma;

gamma = alpha + beta; // 27

cout << "\ngamma ="; gamma.putInt();

gamma = alpha - beta; // 13

cout << "\ngamma ="; gamma.putInt();

gamma = alpha * beta; // 140

cout << "\ngamma ="; gamma.putInt();

gamma = alpha / beta; // 2

cout << "\ngamma ="; gamma.putInt();

delta = 2147483647;

gamma = delta +alpha; // ошибка переполнения

delta =-2147483647;

gamma = delta -alpha; // ошибка переполнения

cout << endl;

return 0;

}

Глава 9

Ответы на вопросы

        1. а, в.

        2. Порожденным.

        3. б, в, г.

        4. Правильный ответ:

class Bosworth :public Alphonso

        1. Утверждение ложно.

        2. Скрытые.

        3. Да (предполагая, что basefunc не скрыта).

        4. Правильный ответ: BosworthObj.alfunc();

        5. Истинно.

        1. Тот, который принадлежит порожденному классу.

        2. Правильный ответ: Bosworth(): Alphonso(){ }

        3. в, г.

        4. Истинно.

        5. Правильный ответ: Derv(int arg):Base(arg)

        6. а.

        7. Истинно.

        8. в.

        9. Правильный ответ:

class Tire :public Wheel, public Rubber

        1. Правильный ответ: Base::func();

        2. Ложно.

        3. Обобщением.

        4. г.

        5. Ложно.

        6. Сильная, агрегации.

Решения упражнений

1. Верное решение:

// ex9_1.cpp

// класс публикаций и порожденные из него

#include <iostream>

#include <string>

using namespace std;

///////////////////////////////////////////////////////////

class publication // базовый класс

{

private:

string title;

float price;

public:

void getdata()

{

cout << "\nВведите заголовок:";cin >> title;

cout << "Введите цену:";cin >> price;

}

void putdata()const

{

cout << "\nЗаголовок:" << title;

cout << "\nЦена:" << price;

}

};

///////////////////////////////////////////////////////////

class book :private publication // порожденный класс

{

private:

int pages;

public:

void getdata()

{

publication::getdata();

cout << "Введите число страниц:";cin >> pages;

}

void putdata()const

{

publication::putdata();

cout << "\nСтраниц:" << pages;

}

};

///////////////////////////////////////////////////////////

class tape :private publication // порожденный класс

{

private:

float time;

public:

void getdata()

{

publication::getdata();

cout << "Введите время звучания:";cin >> time;

}

void putdata()const

{

publication::putdata();

cout << "\nВремя звучания:" << time;

}

};

///////////////////////////////////////////////////////////

int main()

{

book book1; // определить публикации

tape tape1;

book1.getdata(); // получить данные о них

tape1.getdata();

book1.putdata(); // вывести данные о них

tape1.putdata();

cout << endl;

return 0;

}

Верное решение: // ex9_2.cpp

// наследование класса String

#include <iostream>

#include <cstring> // для strcpy(), etc.

using namespace std;

///////////////////////////////////////////////////////////

class String // базовый класс

{

protected: // Примечание: не обязательно

// делать их скрытыми

enum { SZ = 80 }; // размер всех объектов String

char str[SZ]; // содержит С-строку

public:

String() // конструктор 0, без аргументов

{ str[0] == '\0'; }

String(char s[]) // конструктор 1, один аргумент

{ strcpy(str, s); }// преобразование из string в String

void display()const // вывести String

{ cout << str; }

operator char*() // функция преобразования

{ return str; } // преобразовать String в C-string

};

///////////////////////////////////////////////////////////

class Pstring :public String // порожденный класс

{

public:

Pstring(char s[]); // конструктор

};

//---------------------------------------------------------

Pstring::Pstring(char s[]) // конструктор для Pstring

{

if(strlen(s)> SZ - 1) // если слишком длинная строка,

{

for(int j = 0; j < SZ-1; j++) // копировать первую SZ-1

str[j] == s[j]; // символы «вручную»

str[j] == '\0'; // добавить служебный символ

}

else // если не слишком длинная,

String(s); // создать нормальную строку

}

///////////////////////////////////////////////////////////

int main()

{ // определить String

Pstring s1 = "Это очень-очень длинная строка, которая, возможно, "

"да, нет, точно, -- превысит размер, ограниченный SZ.";

cout << "\ns1 ="; s1.display(); // вывести String

Pstring s2 = "А это коротенькая строка.";// определить String

cout << "\ns2 ="; s2.display(); // вывести String

cout << endl;

return 0;

}

3. Верное решение:

// ex9_3.cpp

// множественное наследование класса публикаций

#include <iostream>

#include <string>

using namespace std;

///////////////////////////////////////////////////////////

class publication

{