O oeprador de seta -> em linguagens como C e C++ é uma conveniência sintática utilizada para acessar membros de uma estrutura ou classe através de um ponteiro. Ele combina duas operações essenciais: desreferenciamento do ponteiro e acesso ao membro.
Considere um ponteiro p_objeto que aponta para uma instância de uma estrutura ou classe. Para acessar um membro chamado campo dessa instância, a notação p_objeto->campo é empregada. Essa sintaxe é equivalente a desreferenciar o ponteiro primeiro para obter o objeto e, em seguida, usar o operador de ponto . para acessar o membro: (*p_objeto).campo.
A utilização do operador -> simplifica a escrita de código, tornando-o mais legível e conciso quando se lida com ponteiros para estruturas ou objetos.
Exemplo Prático
Vamos ilustrar com um exemplo envolvendo uma estrutura Livro que armazena o título e o autor:
struct Livro {
char titulo[100];
char autor[100];
};
Agora, criaremos um ponteiro para essa estrutura e o utilizaremos para popular seus campos:
#include <iostream>
#include <string>
struct Livro {
char titulo[100];
char autor[100];
};
int main() {
int quantidade;
std::cout << "Quantos livros deseja registrar? ";
std::cin >> quantidade;
std::cin.ignore(); // Limpa o buffer do newline após a leitura do inteiro
Livro* catalogo[10]; // Array de ponteiros para Livro
for (int i = 0; i < quantidade; ++i) {
catalogo[i] = new Livro(); // Aloca memória dinamicamente para um novo Livro
std::cout << "\n--- Livro " << i + 1 << " ---" << std::endl;
std::cout << "Digite o título: ";
std::cin.getline(catalogo[i]->titulo, 100); // Usa '->' para acessar o membro 'titulo'
std::cout << "Digite o autor: ";
std::cin.getline(catalogo[i]->autor, 100); // Usa '->' para acessar o membro 'autor'
}
std::cout << "\n--- Catálogo Registrado ---" << std::endl;
for (int i = 0; i < quantidade; ++i) {
std::cout << "Livro " << i + 1 << ":\n";
std::cout << " Título: " << catalogo[i]->titulo << "\n";
std::cout << " Autor: " << catalogo[i]->autor << std::endl;
}
// Libera a memória alocada dinamicamente
for (int i = 0; i < quantidade; ++i) {
delete catalogo[i];
}
return 0;
}
Neste exemplo, catalogo[i] é um ponteiro para uma estrutura Livro. O operador -> permite que acessemos diretamente os membros titulo e autor do livro apontado, sem a necessidade de desreferenciar explicitamente o ponteiro com *.
A linha catalogo[i] = new Livro(); demonstra a alocação dinâmica de memória em C++. O operador new cria uma nova instância de Livro na heap e retorna um ponteiro para ela. É crucial liberar essa memória posteriormente usando delete catalogo[i]; para evitar vazamentos de memória.