Inicializar matriz de objetos em C++

Jinku Hu 12 outubro 2023
  1. Use o new operador para inicializar matriz de objetos com construtores parametrizados em C++
  2. Use a função std::vector::push_back para inicializar o array de objetos com construtores parametrizados
  3. Use a função std::vector::emplace_back para inicializar o array de objetos com construtores parametrizados
Inicializar matriz de objetos em C++

Este artigo demonstrará vários métodos sobre como inicializar um array de objetos com construtores parametrizados em C++.

Use o new operador para inicializar matriz de objetos com construtores parametrizados em C++

O operador new faz parte da interface de gerenciamento de memória dinâmica C++ e é equivalente à função malloc da linguagem C. Observe que o gerenciamento de memória dinâmica envolve o fluxo no qual o usuário aloca a memória de um tamanho fixo especificado e a retorna ao sistema quando não for mais necessária.

new é usado para solicitar o número fixo de bytes do sistema, que retorna o ponteiro para a região da memória se a chamada for bem-sucedida. No exemplo a seguir, definimos uma classe chamada Pair com dois construtores e printPair para enviar os membros de dados para o console. Primeiramente, precisamos alocar um array de quatro membros de Pairs usando o operador new. Em seguida, podemos percorrer o array com o loop for e cada iteração inicializar o elemento com o construtor parametrizado. Lembre-se, porém, de que o array alocado deve ser liberado antes da saída do programa usando o operador delete. Observe também que a notação delete [] é necessária para desalocar cada elemento do array.

#include <iostream>
#include <vector>

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

class Pair {
  int x, y;

 public:
  Pair() = default;
  Pair(int a, int b) : x(a), y(b) {}

  void printPair() const { cout << "x: " << x << endl << "y: " << y << endl; }
};
int main() {
  Pair *arr = new Pair[4];

  for (int i = 0; i < 4; ++i) {
    arr[i] = Pair(i * 2, i * i);
  }

  for (int i = 0; i < 4; ++i) {
    arr[i].printPair();
  }

  delete[] arr;
  return EXIT_SUCCESS;
}

Resultado:

x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9

Use a função std::vector::push_back para inicializar o array de objetos com construtores parametrizados

Alternativamente, uma abordagem mais sem cabeça seria armazenar os objetos no contêiner std::vector, que forneceria a função embutida para inicializar novos elementos dinamicamente. Ou seja, a definição de Pair permanece a mesma, mas a cada iteração, chamaremos a função push_back e passaremos o valor Pair do segundo construtor. No lado positivo, não precisamos nos preocupar com a desalocação dos recursos de memória; eles são limpos automaticamente.

#include <iostream>
#include <vector>

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

class Pair {
  int x, y;

 public:
  Pair() = default;
  Pair(int a, int b) : x(a), y(b) {}

  void printPair() const { cout << "x: " << x << endl << "y: " << y << endl; }
};
int main() {
  vector<Pair> array;

  for (int i = 0; i < 4; ++i) {
    array.push_back(Pair(i * 2, i * i));
  }

  for (const auto &item : array) {
    item.printPair();
  }

  return EXIT_SUCCESS;
}

Resultado:

x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9

Use a função std::vector::emplace_back para inicializar o array de objetos com construtores parametrizados

Outro método para inicializar um array de objetos com construtores parametrizados é utilizar a função emplace_back da classe std::vector. Desta forma, precisamos apenas passar os valores do construtor Pair, e emplace_back construirá automaticamente um novo elemento para nós. Como o método anterior, este também não precisa que o usuário se preocupe com o gerenciamento de memória.

#include <iostream>
#include <vector>

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

class Pair {
  int x, y;

 public:
  Pair() = default;
  Pair(int a, int b) : x(a), y(b) {}

  void printPair() const { cout << "x: " << x << endl << "y: " << y << endl; }
};
int main() {
  vector<Pair> array;

  for (int i = 0; i < 4; ++i) {
    array.emplace_back(i * 2, i * i);
  }

  for (const auto &item : array) {
    item.printPair();
  }

  return EXIT_SUCCESS;
}

Resultado:

x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9
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++ Array