- •Int main () {
- •Int main () {
- •Int main () {
- •Int main (){
- •Int main () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Итоговый тест №8.
- •Int main () {
- •Int main() {
- •Int main () {
- •Int main() {
- •Int main () {
- •Int main() {
- •Int main () {
- •Int main() {
- •Итоговый тест№9 Перегрузку операций.
- •Int main () {
- •Int main() {
- •Int main () {
- •Int main()
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;
}
