#include <iostream>
#include <cmath>
using std::cout, std::endl;

/* 
    Константные ссылки нужны прежде всего, чтобы передавать большие объекты в функции, внутри которых они не должны меняться

    Рассмотрим структуру Book, чей размер более 100 байт

    
    1) При передаче такой структуры в функцию по значению, как это происходит в функции printBookV,
    вся структура будет копироваться внутрь функции и это очень медленно. Так делать не стоит.

    
    2) При передаче такой структуры в функцию по обычной ссылке, как это происходит в функции printBookR, структура не копируется
    На самом деле, под капотом внутрь функции копируется адрес структуры.
    Адрес намного меньше самой структуры, поэтому это копирование работает намного быстрее.

    Но возникает проблема с тем, что структура внутри такой функции может поменяться.
    В реальной ситуации, если функций много и они большие, уследить за тем меняется ли аргументы внутри функций становится проблематично.


    3) При передаче такой структуры в функцию по константной ссылке, как это происходит в функции printBookCR, структура не копируется.
    Плюс к этому мы можем быть уверены, что внутри функции наша структура не поменяется и это сильно упрощает понимание программы.

*/

struct Book
{
    char title[100];
    int pages;
    float price;
};


void printBookV(Book b)
{
    cout << b.title << ", pages = " << b.pages << ", price = " << b.price << endl;
}


void printBookR(Book& b)
{
    cout << b.title << ", pages = " << b.pages << ", price = " << b.price << endl;
}


void printBookCR(const Book& b)
{
    cout << b.title << ", pages = " << b.pages << ", price = " << b.price << endl;
}


int main() 
{
    Book b = {"War and Peace", 1200, 900};

    printBookV(b);
    printBookR(b);
    printBookCR(b);
}


