Обясните пожалуйста для чего делаеться const в начале и const в конце, и в чем вообще разница?
const Cash Product::GetPrice() const { return price; }
Использование const
в начале объявления метода привязывает его к типу возвращаемого значения, т.е. говорит о том, что Вы возвращаете из метода константный объект.
Когда вы используете const
в конце объявления метода, сам метод становится константным (ничего не изменяющим в объекте) и, как следствие, доступным для вызова через константные объекты.
Данное объявление
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 &&
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть счётная программа, в которой используется несколько методов, выбор метода реализован с помощью comboBox:
День добрый! Вот моя задача:
У меня запускается код с компилятором gnu++1y, но при использовании gnu c++ 11 49 выдает ошибку
Хочу организовать проверку форматирования кода на стороне ci с помощью clang-format и опции -output-replacements-xmlЗадумка была такая: если файл не отформатирован,...