Загружаем изображение…
Основное из 11 главы Прата.

Дружественные функции.
Это функции, не являющиеся членами класса, но имеющие доступ к закрытым данным. Нужны, когда левый операнд не является объектом класса. Для того, чтобы функция стала дружественной, необходимо добавить friend перед типом функции, пример:
friend std::ostream& operator<<(std::ostream & os, const Distance & d);
Здесь, кстати, мы используем перегрузку оператора <<, для того, чтобы выводить объекты необходимо возвращать сам объект cout (std::ostream), который мы обозначим как os.
Преобразование.
Не думаю, что это хороший способ, но посмотрим на него.
У нас будет конструктор с 1 аргументом и мы благодаря это сможем делать неявное преобразование:
file.h //заголовочный файл
Distance(int m);
main.cpp //основной файл исполнения


#include <iostream>
#include "file.h"
Distance::Distance(int m, int cm) : meters(m), centimeters(cm) {}
Distance::Distance(int m) {
    meters = m;
};
Distance Distance::operator+(const Distance& other) {
    centimeters = centimeters + other.centimeters;
    meters += other.meters + centimeters / 100;
    centimeters %= 100;
    return *this;
}
std::ostream & operator<<(std::ostream & os, const Distance& d) {
    os << "m: "<< d.meters << " cm: "  << d.centimeters << std::endl;
    return os;
}
void Distance::show() const {
    std::cout << meters << " m " << centimeters << " cm" << std::endl;
}
 
int main() {
    Distance d = 50;
    std::cout << d << std::endl;
    return 0;
}

 
Чем плохо такое преобразование, может возникнуть момент, когда мы случайно объект делаем числом или другим типом не ожидая этого, как показано в последней строке – так происходит из-за неявного преобразования. Чтобы исключить  возможные проблемы, в заголовочный файл file.h добавим к конструктору ключевое слово explicit, что запретит неявное преобразование.

    // Distance d = 50;  - ошибка, неявное преобразование
    Distance d(50); // явное преобразование, мы так и задумывали.
    std::cout << d << std::endl;
Просмотры: 17
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти