Семинар 14 (02.12.2016)

Ссылки, константные ссылки и объекты в сигнатурах методов

Некоторые принципы использования ссылок, константных ссылок, объектов и указателей в сигнатурах методов.

// Пример
class Container {
    // ...
    int size() const; // получить размер контейнера, содержимое контейнера при этом не меняется.
    // ...
};
int calculateSizeOf(const Container & c);

// std::ostream нельзя копировать, поэтому он передается в operator<< и возвращается по ссылке.
// Ссылка неконстантная, потому что в процессе работы меняется состояние потока вывода.
// Объект Container в процессе вывода не изменяется.
std::ostream & operator<<(std::ostream & out, const Container & c);
class Container {
    // ...
    Container & operator=(const Containter & another) {
        // ...
        return * this;
    }
    Contaiter & operator+=(const Containter & another);
    // ...
};
class Container {
    // ...
    Container operator+(const Containter & another) const;
    bool operator==(const Containter & another) const;
    // ...
};
class ContainerOfItems {
    // ...
    // Константный оператор будет использоваться, когда модификация объекта не требуется:
    // cout << c[1] << endl;
    const Item & operator[](int i) const;

    // Неконстантный - когда происходит изменение объекта:
    // c[1] = 2;
    Item & operator[](int i);
    // ...
};
void setSize(int size);

Полезные опции компилятора

Компиляторы g++ и clang поддерживают опцию -Wall, которая позволяет выводить все warning'и в процессе компиляции.