Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кдз / кдз программирование черновик.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
64.23 Кб
Скачать

Int main () {

Welcome hello;

hello.print ();

return 0;

}

Ответ:

#include <iostream>

class Welcome {

private:

char* m_data;

public:

Welcome() {

m_data = new char[14];

const char* init = "Hello, World!";

for (int i = 0; i < 14; ++i)

m_data[i] = init[i];

}

~Welcome() {

delete m_data;

std::cout << std::endl << "Data was deleted." << std::endl;

}

void print() const {

std::cout << m_data;

}

};

Int main() {

Welcome hello;

hello.print();

return 0;

}

Итоговый тест№9 Перегрузку операций.

Тест

Задание №1

Предположим, что Square — это класс, а square — это объект этого класса. Какой способ перегрузки лучше использовать для следующих операторов?

square + square

-square

std::cout << square

square = 7;

Ответ: перегрузить можно любую операцию

Задание №2

Напишите класс Average, который будет вычислять среднее значение всех передаваемых ему целых чисел. Используйте два члена: первый должен быть типа int32_t и использоваться для вычисления суммы всех передаваемых чисел, второй должен быть типа int8_t и использоваться для вычисления количества передаваемых чисел. Чтобы найти среднее значение, нужно разделить сумму на количество.

a) Следующий код функции main ():

Int main () {

Average avg;

avg += 5;

std::cout << avg << '\n'; // 5 / 1 = 5

avg += 9;

std::cout << avg << '\n'; // (5 + 9) / 2 = 7

avg += 19;

std::cout << avg << '\n'; // (5 + 9 + 19) / 3 = 11

avg += -9;

std::cout << avg << '\n'; // (5 + 9 + 19 - 9) / 4 = 6

(avg += 7) += 11; // выполнение цепочки операций

std::cout << avg << '\n'; // (5 + 9 + 19 - 9 + 7 + 11) / 6 = 7

Average copy = avg;

std::cout << copy << '\n';

return 0;

}

Должен выдавать следующий результат:

5

7

11

6

7

7

Ответ:

#include <iostream>

using namespace std;

class Average

{

private:

int_least32_t m_total; // прописываем типы необходимых данных

int_least8_t m_numbers;

public:

Average()

{

}

friend std::ostream& operator<<(std::ostream& out, const Average& average) //объявляем дружественный поток для того, чтоб прописать оператор вывода

//для того, чтоб вывести члены класса

{

out << static_cast<double>(average.m_total) / average.m_numbers; //так как здесь нужно деление с плавающей запятой, а не целочисленное

//мы используем системное преобразование типов для более точного результата

return out;

}

Average& operator+=(int num) // Поскольку operator+= изменяет свой левый операнд, мы запишем его как член

{

m_total += num;

++m_numbers;

return *this;

}

};

Int main() {

Average avg;

avg += 5;

std::cout << avg << '\n'; // 5 / 1 = 5

avg += 9;

std::cout << avg << '\n'; // (5 + 9) / 2 = 7

avg += 19;

std::cout << avg << '\n'; // (5 + 9 + 19) / 3 = 11

avg += -9;

std::cout << avg << '\n'; // (5 + 9 + 19 - 9) / 4 = 6

(avg += 7) += 11; // выполнение цепочки операций

std::cout << avg << '\n'; // (5 + 9 + 19 - 9 + 7 + 11) / 6 = 7

Average copy = avg;

std::cout << copy << '\n';

return 0;

}

b) Требуется ли этому классу явный конструктор копирования или операция присваивания?

Ответ: здесь можно обойтись без явного конструктора копирования или операции присваивания.

Задание №3

Напишите свой собственный класс-массив целых чисел IntArray (не используйте std::array или std::vector). Пользователи должны передавать размер массива при создании объекта этого класса, а сам массив (переменная-член) должен выделяться динамически. Используйте макрос assert для проверки передаваемых значений, а также свой конструктор копирования и перегрузку операции присваивания, если это необходимо, чтобы следующий код:

#include <iostream>

IntArray fillArray() {

IntArray a (6);

a[0] = 6;

a[1] = 7;

a[2] = 3;

a[3] = 4;

a[4] = 5;

a[5] = 8;

return a;

}

Соседние файлы в папке кдз