Usar Qualificador Constante Com Ponteiros em C++
-
Utilizar a notação
const type var
para declarar um objecto de leitura em C++ -
Utilize o qualificador
const
com apontadores para tratar de objectos só de leitura em C++
![Usar Qualificador Constante Com Ponteiros em C++](/img/Cpp/feature-image---cpp-const-pointer.webp)
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
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