Я знаю, что постоянные объекты или функции могут работать только на постоянных членах, но работает ли это наоборот?Возможны ли регулярные экземпляры функций вызова класса?
ответ
Регулярные (не const) функции-члены класса могут вызывать функции-члены const и non const.
Короткий ответ Да.
Это красота функций const
на C++. Вы можете перегрузить метод, основанный на его const
-ness:
class Vector
{
public:
int GetItem();
int GetItem() const;
};
const Vector
объект может вызвать вызов сопзЬ метода, но неконстантная (Vector
) вызовет вызов неконстантных. Пусть компилятор определит, какой метод (const или non-const) должен вызывать. Следовательно:
v.GetItem();
Может вызвать любого из них, в зависимости от фактического типа v
.
Почему C++ позволяет это рассматривать случай, когда какой-либо метод «Get» должен быть функцией только для чтения? Ну, а не оправданием языка-юриста, подумайте об этом.
вектор v; v [0] = 10;
Если перегруженный оператор в vector<>
объявлен как const
, это не позволит оператору ([]
), которые будут использоваться на левой стороне (т.е. как L-значение). Если только неконстантная обеспечивается, это не удастся:
void process(const vector<int>& v)
{
cout << v[0]; // Must call const op []
}
Но поскольку метод может быть перегрузка на основе const
, компилятор определяет, какие перегружать позвонить.
С другой стороны, C++ разрешает const
отличать не-const и наоборот (const_cast
и C-style cast), вы всегда можете вызывать другую версию из объекта (non) const.
((Vector*)&cv)->GetItem();
Почему вы не попробовали? (Ответ «да», объект передается как «const T * this» для вызова) –
Компилятор может неявно отбрасывать объект в 'const &' этого типа. Поэтому, когда не const-объект, по-видимому, используется для вызов функции const, неявный const cast этого объекта фактически используется. (Точно так же, как если бы вы передали объект non const какой-либо функции, которая явно принимает 'const &') – JSF
@MatsPetersson Потому что на C++ что-то компилируется и выполняется успешно не является достаточным доказательством того, что он действителен, а не, например, неопределенное поведение. – emlai