const в начале и const в конце

309
11 февраля 2020, 15:20

Обясните пожалуйста для чего делаеться const в начале и const в конце, и в чем вообще разница?

const Cash Product::GetPrice() const { return price; }
Answer 1

Использование const в начале объявления метода привязывает его к типу возвращаемого значения, т.е. говорит о том, что Вы возвращаете из метода константный объект.

Когда вы используете const в конце объявления метода, сам метод становится константным (ничего не изменяющим в объекте) и, как следствие, доступным для вызова через константные объекты.

Answer 2

Данное объявление

const Cash Product::GetPrice() const { return price; }

определяет не статическую функцию-член класса с именем GetPrice для классе Product.

Первый квалификатор const относится к возвращаемому значению функции, то есть к объекту типа Cash.

Квалификтор const, стоящий после списка параметров, относится к самой функции и говорит о том, что функция не изменяет объект типа Product, для которого она вызывается.

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

Также для не статических функций-членов класса можно указывать квалификаторы ссылок, которые определяют, для какого типа ссылки (lvalur или rvalue) на объект класса может быть вызвана соответствующая не статическая функция-член класса.

Ниже приведена демонстрационная программа

#include <iostream>
struct Cash
{
    Cash( unsigned int value ) : value( value )
    {
    }
    unsigned int value;
};
struct Product
{
    Product( unsigned int price ) : price( price )
    {
    }
    const Cash GetPrice()  & 
    {
        std::cout << " - const Cash Product::GetPrice() & is called - ";
        return price + 10; 
    }   
    const Cash GetPrice() const & 
    {
        std::cout << " - const Cash Product::GetPrice() const & is called - ";
        return price; 
    }   
    const Cash GetPrice() const && 
    { 
        std::cout << " - const Cash Product::GetPrice() const && is called - ";
        return price; 
    }
    unsigned int price;
};
int main()
{
    const Product p1( 10 );
    std::cout << "cash" << p1.GetPrice().value << '\n';
    Product p2( 10 );
    std::cout << "cash" << p2.GetPrice().value << '\n';
    std::cout << "cash" << Product( 10 ).GetPrice().value << '\n';
}

Вывод программы на консоль:

cash - const Cash Product::GetPrice() const & is called - 10
cash - const Cash Product::GetPrice() & is called - 20
cash - const Cash Product::GetPrice() const && is called - 10

Так как объект p1 является константным, то для него вызывает функция с квалификаторами const &.

Объект p2 не является константным, и для него вызывается функция с квалификатором ссылки &.

В последнем вызове функции используется временный объект, поэтому для него вызывается функция с квалификаторами const &&.

READ ALSO
Перерисовка полей ввода параметров

Перерисовка полей ввода параметров

Есть счётная программа, в которой используется несколько методов, выбор метода реализован с помощью comboBox:

290
Разница между компиляторами c++1y и gnu c++ 11 4.9

Разница между компиляторами c++1y и gnu c++ 11 4.9

У меня запускается код с компилятором gnu++1y, но при использовании gnu c++ 11 49 выдает ошибку

284
Проверка форматирования кода

Проверка форматирования кода

Хочу организовать проверку форматирования кода на стороне ci с помощью clang-format и опции -output-replacements-xmlЗадумка была такая: если файл не отформатирован,...

275