C++에서 포인터에 한정자 사용
이 기사는 C++에서 포인터와 함께const
한정자를 사용하는 방법에 대한 여러 방법을 보여줍니다.
const type var
표기법을 사용하여 C++에서 읽기 전용 개체 선언
C++는 읽기 전용 (불변)으로 정의해야하는 객체의 한정자로 const
키워드를 제공합니다. const
변수는const type var
또는type const var
표기법으로 선언되며, 둘 다 구문 상 정확하지만 전자는 기존 스타일로 사용됩니다. const
한정된 객체는 변경할 수 없으므로 선언 중에 초기화되어야합니다. 이렇게하면const int number;
문이 만들어집니다.-유효하지 않고 컴파일러 오류가 발생합니다 (아마도 IDE에서도 비명을 지 릅니다).
const
변수가 초기화되면 런타임 중에 다른 값을 할당 할 수 없습니다. 따라서 다음 예제의main
함수에서 세 번째 줄은 유효하지 않으며 컴파일러에서 처리하지 않습니다. 동일한 유형의 변수에 대한 포인터를 선언 한 다음 const
변수의 주소를 할당하려고하면 컴파일러에서 오류를보고합니다. 후자의 오류는 보통-fpermissive
플래그로 컴파일하면 무시됩니다.
#include <iostream>
int main() {
const int number = 1234;
number = 235; // Error
int *ptr = &number; // Error
return 0;
}
포인터와 함께const
한정자를 사용하여 C++에서 읽기 전용 개체 처리
const
한정자는 종종 포인터와 함께 사용됩니다. const type * var
, type * const var
및 const type * const var
의 세 가지 유형의 선언이 있습니다. 첫 번째는 읽기 전용type
객체에 대한var
포인터를 선언합니다. 이는 객체를 수정할 수 없지만 포인터 자체는 수정할 수 있음을 의미합니다. 두 번째-type
객체에 대한 읽기 전용 포인터로, 여기서 고유 한 것으로 선언하고 수정할 수있는 객체에 대한 불변 포인터이며 마지막 하나는 포인터와 객체를 모두 불변으로 정의합니다.
이러한 표기법은 다음 코드 샘플에서 살펴볼 여러 유용한 기능을 제공합니다. 마지막 예에서 볼 수 있듯이 상수가 아닌 포인터에const
변수의 주소를 저장할 수 없지만 const 지정자를 추가하면 연산이 유효합니다. 하지만 우리는 여전히main
루프의 4 번째 줄에서 보여준 것처럼 새로 선언 된 포인터를 통해 저장된 값을 수정할 수 없습니다.
#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;
}
출력:
number - 1234
*c_ptr - 1234
포인터와 함께const
한정자를 사용하는 동안 또 다른 일반적인 문제는 읽기 전용 개체를 가리키는 포인터에 대한 비 상수 포인터 할당입니다. 다음 코드 예제에서 초기화 된 상수가 아닌 변수 number2
가 새로 추가되었으며 const
개체에 대한 포인터로 선언 된 c_ptr
에 이제 number2
주소가 할당됩니다. 이 연산은 C++에서 합법적이며 결과적으로c_ptr
을 통해number2
변수에 저장된 값만 읽을 수 있지만 수정하면 컴파일러 오류가 발생합니다.
#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;
}
출력:
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