2015-11-14 2 views
1

Я знаю, что постоянные объекты или функции могут работать только на постоянных членах, но работает ли это наоборот?Возможны ли регулярные экземпляры функций вызова класса?

+2

Почему вы не попробовали? (Ответ «да», объект передается как «const T * this» для вызова) –

+0

Компилятор может неявно отбрасывать объект в 'const &' этого типа. Поэтому, когда не const-объект, по-видимому, используется для вызов функции const, неявный const cast этого объекта фактически используется. (Точно так же, как если бы вы передали объект non const какой-либо функции, которая явно принимает 'const &') – JSF

+0

@MatsPetersson Потому что на C++ что-то компилируется и выполняется успешно не является достаточным доказательством того, что он действителен, а не, например, неопределенное поведение. – emlai

ответ

2

Регулярные (не const) функции-члены класса могут вызывать функции-члены const и non const.

2

Короткий ответ Да.

Это красота функций 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();