Usar Qualificador Constante Com Ponteiros em C++

Jinku Hu 12 outubro 2023
  1. Utilizar a notação const type var para declarar um objecto de leitura em C++
  2. Utilize o qualificador const com apontadores para tratar de objectos só de leitura em C++
Usar Qualificador Constante Com Ponteiros em C++

Este artigo irá demonstrar múltiplos métodos sobre como utilizar um qualificador de const com ponteiros em C++.

Utilizar a notação const type var para declarar um objecto de leitura em C++

O C++ fornece a palavra-chave const como qualificador para objectos que precisam de ser definidos como apenas de leitura (imutável). As variáveis const são declaradas com a notação const tipo var ou type const var, ambas sintacticamente correctas, mas a primeira é utilizada como estilo convencional. Uma vez que os objectos const qualificados não são mutáveis, devem ser inicializados durante a declaração. Isto faz uma declaração const int number; - inválida e lança erro de compilador (provavelmente a sua IDE também gritará sobre isso).

Quando a variável const é inicializada, não lhe pode ser atribuído um valor diferente durante o tempo de execução. Assim, a terceira linha na função main do exemplo seguinte é inválida, e o compilador não a processará. Note que se declarar um ponteiro para o mesmo tipo de variável e depois tentar atribuir-lhe o endereço da variável const, o erro é comunicado pelo compilador. Note que este último erro é normalmente anulado se compilarmos com a bandeira -fpermissive.

#include <iostream>

int main() {
  const int number = 1234;

  number = 235;        // Error
  int *ptr = &number;  // Error

  return 0;
}

Utilize o qualificador const com apontadores para tratar de objectos só de leitura em C++

O qualificador const é frequentemente utilizado com apontadores. Existem três tipos de declarações const typo * var, type *const var e const type *const var. O primeiro declara o ponteiro var para o objecto type apenas de leitura, o que significa que o objecto não pode ser modificado, mas o próprio ponteiro pode ser. O segundo - var ponteiro só de leitura para o objecto type, onde declaramos único, um ponteiro imutável para o objecto que pode ser modificado, e o último define ambos - ponteiro e o objecto como imutáveis.

Estas notações fornecem múltiplas características úteis que são exploradas nas seguintes amostras de código. Como mostrado no último exemplo, não pudemos armazenar o endereço da variável const num ponteiro não-constante, mas se adicionarmos o especificador const, a operação é válida. No entanto, ainda não podemos modificar o valor armazenado através do ponteiro recentemente declarado, como demonstrado na 4ª linha do laço main:

#include <iostream>

using std::cout;
using std::endl;

#define STR(num) #num

int main() {
  const int number = 1234;

  const int *c_ptr = &number;
  //    *c_ptr = 42; // Error

  cout << STR(number) << " - " << number << endl;
  cout << STR(*c_ptr) << " - " << *c_ptr << endl;

  return 0;
}

Resultado:

number - 1234
*c_ptr - 1234

Outra questão comum ao utilizar o qualificador const com apontadores é a atribuição de apontadores não constantes aos apontadores que apontam para os objectos só de leitura. Note-se que, há uma nova variável não-constante number2 inicializada no próximo exemplo de código, e a c_ptr que foi declarada como apontador para o objecto const, é agora atribuída com o endereço de number2. Esta operação é legal em C++, e a consequência é que só podemos ler o valor armazenado na variável number2 via c_ptr, mas quaisquer modificações resultarão num erro de compilação.

#include <iostream>

using std::cout;
using std::endl;

#define STR(num) #num

int main() {
  const int number = 1234;
  const int *c_ptr = &number;

  int number2 = 3456;
  c_ptr = &number2;
  //    *c_ptr += 12; // Error
  number2 += 12;

  cout << STR(number) << " - " << number2 << endl;
  cout << STR(*c_ptr) << " - " << *c_ptr << endl;

  return 0;
}

Resultado:

number2 - 3468
*c_ptr - 3468
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++ Const

Artigo relacionado - C++ Pointer