2010-03-18 3 views

ответ

12

Поскольку вы просите его в комментариях. То, что вы, вероятно, ищете можно найти в стандарте (доступ к члену 5.2.5 Class):

3 Если E1 имеет тип «указатель на класс X», то выражение E1-> Е2 преобразуется в эквивалентную форму (* (E1)). E2;

Компилятор выдаст точные инструкции, и он будет таким же эффективным. Ваша машина не будет знать, написали ли вы «->» или «*.».

+0

Да. Это то, что я искал - независимо от того, являются ли они одинаковыми. – Rachel

15

[Редактировать]

Если переменная определена как T * (где Т некоторый тип), то оба -> и * являются одинаковыми (если PTR не равно нулю).

Если переменная является экземпляром класса (по значению или по ссылке), то -> и * должны вести себя одинаково (за лучшую практику), но для этого требуется, чтобы класс перегружал их одинаково.

+1

-> и * не работают на самих типах T, но на типе T *, который является указателем. –

+8

Если базовый класс * * перегружает '->' или '*', он должен перегружать оба, чтобы он оставался прежним. Иначе это плохо спроектировано. –

+0

@Brian '->' и '*' работают на все, что определяет 'operator->' и 'operator *'. * И * также для всех типов указателей. –

7

Оператор -> является особенным в том, что в большинстве случаев он «сверлит-вниз» рекурсивно, пока результат выражения больше не является чем-то, для которого определен оператор перегрузки ->. Выражение (*subxpression).x делает только один разыменования на подвыражения, так что если результат (*subexpression) еще один указатель, то это не будет компилировать (вам нужно будет написать (*(*subexpression)).x Смотрите следующий код для лучшей иллюстрации:.

#include <iostream> 
using namespace std; 

class MyClass 
{ 
public: 
    MyClass() : x(0) {} 
    int x; 
}; 

class MyPtr 
{ 
private: 
    MyClass* mObj; 
public: 
    MyPtr(MyClass* obj) : mObj(obj) {} 
    MyClass* operator->() 
    { 
     return mObj; 
    } 
}; 

int main() 
{ 
    MyClass obj; 
    MyClass* objCPtr = &obj; 
    MyClass** objCHandle = &objCPtr; 
    MyPtr ptr(&obj); 
    cout << ptr->x << endl; 
    cout << (*(*objCHandle)).x << endl; 
} 

однако следует отметить, что это не будет составлять:.

cout << objCHandle->x << endl; 

Поскольку сверло вниз поведение -> только возникает, когда левая часть выражения является класс, структура, объединение, или обобщенный тип В этом случае, objCHandle - это MyClass **, поэтому он не подходит.

+1

@Jeremy: Я добавил несколько обратных шагов, чтобы остановить звездочки от интерпретации команд форматирования :). –

+0

@Andrew: спасибо! –

Смежные вопросы