Hay dos tipos de operadores miembros:
- Operador de desreferencia *
- Operador de flecha ->
Criterio de diseño
- El operador de flecha debe ser miembro de la clase.
- El operador de desreferencia también suele ser miembro de la clase, aunque no tiene por qué serlo.
- El operador de flecha sobrecargado debe devolver un puntero a la clase o un objeto de una clase con un operador de flecha personalizado
- La diferencia entre desreferencia y multiplicación es que uno es un operador unario y el otro es un operador binario.
p.ej.
class StrBlobTest {
size_type size() const {
return data->size(); }
std::string& operator*()const
{
return (*data)[i];
}
std::string* operator->()const
{
return &this->operator*(); //返回解引用结果的地址
}
...
}
StrBlobTest v1("a", "b");
*v1 = "123555";
std::cout << (&v1)->size() << std::endl;//调用 StrBlobTest 的size()函数
std::cout << v1->size() << std::endl;//调用 std::string* operator->()const
Para una expresión de la forma point-> mem, point debe ser un puntero a un objeto de clase o un objeto de una clase que sobrecarga operador->. El tipo de punto es diferente, el significado de point-> mem también es diferente.
1. Si el punto es un puntero, se llama al operador de flecha incorporado y la expresión es equivalente a (* punto) .mem.
2. Si point es un objeto de una clase que sobrecarga operator->, use el resultado de point.operator -> () para obtener mem, y la expresión es equivalente a (point.operator -> ()) -> mem. Entre ellos, si el resultado es un puntero, se ejecuta el primer paso; si el resultado en sí contiene el operador sobrecargado->, el paso actual se llama repetidamente.
【referencia】