Existem dois tipos de operadores membros:
- Operador de desreferência *
- Operador de seta ->
Critérios de projeto
- O operador de seta deve ser um membro da classe.
- O operador de desreferência geralmente também é um membro da classe, embora não precise ser.
- O operador de seta sobrecarregado deve retornar um ponteiro para a classe ou um objeto de uma classe com um operador de seta personalizado
- A diferença entre desreferência e multiplicação é que um é um operador unário e o outro é um operador binário.
por exemplo.
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 uma expressão da forma ponto-> mem, ponto deve ser um ponteiro para um objeto de classe ou um objeto de uma classe que sobrecarrega operador->. O tipo de ponto é diferente, o significado de ponto-> mem também é diferente.
1. Se ponto for um ponteiro, o operador de seta embutido é chamado e a expressão é equivalente a (* ponto) .mem.
2. Se point for um objeto de uma classe que sobrecarrega operator->, use o resultado de point.operator -> () para obter mem, e a expressão será equivalente a (point.operator -> ()) -> mem. Entre eles, se o resultado for um ponteiro, o primeiro passo é executado; se o próprio resultado contiver operador-> sobrecarregado, o passo atual é chamado repetidamente.
【referência】