Usar Qualificador Constante Com Ponteiros em C++
-
Utilizar a notação
const type varpara declarar um objecto de leitura em C++ -
Utilize o qualificador
constcom apontadores para tratar de objectos só de leitura 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
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