Operador de sobrecarga de subscrição em C++

Jinku Hu 12 outubro 2023
Operador de sobrecarga de subscrição em C++

Este artigo demonstrará como sobrecarregar o operador subscrito / índice em C++.

Operador de Subscrito de Sobrecarga usando a notação operator[] em C++

A sobrecarga do operador é um recurso poderoso da linguagem C++. Dá ao programador as facilidades para redefinir o significado dos operadores existentes para quaisquer classes definidas pelo usuário. Essencialmente, os operadores sobrecarregados são funções e são definidos como tal, exceto pelo fato de terem nomes especiais. Os nomes devem começar com o prefixo operator seguido pelo símbolo do operador que está sendo sobrecarregado.

Geralmente, as funções de sobrecarga do operador têm o mesmo número de parâmetros que os operandos do operador fornecido. Portanto, nossa sobrecarga de operador subscrito aceitará dois parâmetros. O código de exemplo a seguir demonstra uma implementação de classe MyClass que tem a função de membro operator[] que conduz uma operação de acesso ao elemento na estrutura interna do vetor e retorna a referência ao elemento. MyClass é basicamente a classe wrapper em torno do contêiner std::vector e fornece várias funções-membro para fins de demonstração.

Observe que a função de membro operator[] tem um parâmetro como o operador subscrito usual. Lembre-se, porém, de que quando a função do operador é declarada como uma função-membro, ela tem o primeiro parâmetro vinculado ao ponteiro this implícito. Portanto, podemos ter um parâmetro a menos que os operandos para sobrecargas de operador declaradas como funções de membro.

#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
class MyClass {
 public:
  MyClass() = default;
  explicit MyClass(const T &data) { vec.push_back(data); };
  MyClass(std::initializer_list<T> list) {
    vec.insert(vec.end(), list.begin(), list.end());
  };

  void push_back(const T &data) { vec.push_back(data); };

  void pop_back() { vec.pop_back(); };

  size_t size() { return vec.size(); };

  T &operator[](size_t pos) { return vec.at(pos); };

  const T &operator[](size_t pos) const { return vec.at(pos); };

 private:
  vector<T> vec;
  string name;
};

int main() {
  MyClass<string> m1 = {"top", "mop", "gop", "sop"};

  for (size_t i = 0; i < m1.size(); ++i) {
    cout << m1[i] << endl;
  }

  cout << "/ ------------------- /" << endl;

  m1.pop_back();
  m1.pop_back();

  for (size_t i = 0; i < m1.size(); ++i) {
    cout << m1[i] << endl;
  }

  return EXIT_SUCCESS;
}

Produção:

top
mop
gop
sop
/ ------------------- /
top
mop

Observe que alguns operadores devem ser sobrecarregados como a função de membro e um deles é um operador subscrito. A função operator[] é recomendada para ter um significado semelhante ao do operador embutido, que recupera o elemento pela posição dada. A sobrecarga de subscrito deve retornar uma referência a ser usada em ambos os lados da atribuição. Também é importante definir duas versões da função operator[], uma para objetos não const e outra para objetos const, uma vez que não queremos que a referência retornada seja atribuível quando o próprio objeto é const qualificado.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ Operator