c++ primer 학습 노트 -----2.4const 한정자

5112 단어 C++primer
const 한정부호의 핵심 가치는 오작동이 변하지 않는 변수의 값을 바꾸는 것을 방지하는 것이다
const 대상이 만들어지면 변경이 일어나지 않기 때문에 정의와 동시에 초기화해야 합니다. (글꼴 값, 임의의 표현식 모두 가능)
const 객체의 파일 간 공유:
[성명과 정의의 설정은 서로 다른 파일 간에 같은 변수를 사용하기 위한 것이다. 물론 이 변수가 확실히 바뀔 경우에만 의미가 있다.
변경되지 않는 const 대상을 파일 간에 공유하지 않으려면, 각 파일 간에const의 값을 전달할 필요가 없습니다
따라서 언어가 기본적으로 다른 파일 내의const 대상은 이름이 같고 함수체 외에 정의되어 있어도 각각의 파일 내의 국부 변수이다(함수 외에 정의된 비상량 변수는 전역 변수이다)
만약const 대상의 값이 불확정한 표현식이라면 파일 간에 const 대상을 공유하는 것은 현실적인 의미가 있다
따라서 언어는 const 대상의 파일 간 공유에 대해 성명과 정의를 하기 전에 extern 키워드를 추가해야 한다고 규정하고 있다(2.2.2 참조).
{이 섹션에는 여러 가지 일치가 있습니다. 실제 이 내용을 사용할 때 유형과 유형이 합법적으로 일치할 수 있는지 반드시 주의해야 합니다}

2.4.1 const의 참조


[인용을const 대상에 연결할 수 있으며 상수에 대한 인용이라고 부른다.
const int a = 0;
const int &s = a;//const  , 
s++;// , 

그러나 이 인용으로 연결된 대상을 수정할 수 없습니다.
[2.3.1 대부분의 경우 인용은 반드시 대상 유형과 일치해야 하지만 두 가지 예외가 있다.
상량 인용은 예외이다. 초기화할 때 상량 인용이 비상량의 같은 유형의 대상, 서로 다른 기본 유형의 대상, 액면가, 심지어 일반 표현식을 허용한다. 상기 여러 가지가 인용 유형으로 변환되기만 하면 된다.
상수 인용이 다른 기본 형식의 대상에 귀속되었을 때, 실제 편집기는 인용과 같은 종류의 임시 변수 (상수) 를 만들어서, 이 서로 다른 유형의 변수를 이 상수 임시 변수에 먼저 값을 부여하고, 상수 인용을 이 임시 변수에 귀속시킨다.
[상술한 상황의 원인은 다음과 같다.
상량 인용은 사실상 자아제한이다. 이것은 단지 자신에게 어떠한 변화도 일어나지 못하도록 제한할 뿐이고 대상 자체에 대한 변화는 제한하지 않기 때문에 비상량의 대상에 귀속될 수 있다.
int i = 0;
const int &s = i;
i++;
int a = s;// , s  
cout << a;// 1, i  s , 

비상량 인용은 일반적으로 인용을 통해 귀속 대상을 바꾸는 데 쓰인다. 서로 다른 유형의 대상에서 할 수 있는 조작이 다르든 서로 다른 유형의 귀속이 인용을 임시량으로 귀속시킬 수 있음을 고려하든 인용을 통해 대상을 바꾸는 목적을 실현할 수 없기 때문에 서로 다른 기본 유형의 대상을 비상량 인용에 부여하는 행위는 불법이다.]

2.4.2 포인터 및 const


[지침과 const가 교차할 때 두 가지 뚜렷한 개념이 있다.
상수 대상을 가리키는 비상량 지침, 비상량 대상을 가리키는 상량 지침(물론 둘 다 상수 또는 둘 다 비상량)도 있다.
const가 나타나는 서로 다른 위치는 도대체 가리키는 대상과 바늘 변수 자체가 상량인지를 결정한다.
int a;// a
const int b;// b
int *const a1 = &a;// a  a1
const int *b1 = &b;// b  b1
const int *const b2 = &b;// b  b2


[상수를 가리키는 지침은 상수 인용과 비슷하고 자기제한이기도 하다. 상수를 가리키는 지침을 통해 가리키는 대상을 바꿀 수 없고 상수 대상의 주소를 저장할 때 상수 대상을 가리키는 지침만 사용할 수 있다.
상수 포인터는 정의와 동시에 초기화되어야 합니다. 정의된 후에 포인터가 가리키는 위치는 변하지 않지만 이 포인터를 통해 포인터가 가리키는 대상을 바꿀 수 있습니다.]

2.4.3 최상위 const


[맨 윗부분 const는 대상 자체가 상수라는 것을 가리킨다.
기본 const는 객체와 연관된 객체가 상수임을 나타냅니다.]
[복사를 실행할 때 값을 부여하는 오른쪽 조작부호로서 맨 윗부분const는 작업에 아무런 영향을 주지 않는다. 왜냐하면 복사 작업은 복사된 대상의 값을 바꾸지 않기 때문이다.
그러나 밑바닥 const 대상이 값을 부여하는 오른쪽 조작부호로서 복사와 복사의 대상은 같은 밑바닥 const 자격이 있어야 한다.또는 서로 전환할 수 있다. 일반적으로 비상량은 상량으로 바뀔 수 있지만 반대로 안 된다.
int i = 0;
const int *p = &i;// , , p  i  , i  p  
const int l = 0;
int *const q = &l;// , q  int  , int  , l  


[상량 인용과 상량을 가리키는 지침은 함께 이해할 수 있다. 둘 다 실제적으로 하나의 비상량을 연결할 수 있다. 단지 이 두 사람의 측면에서 볼 때 그들이 연관된 것은 상량이다. 이 두 사람 자체는 그들의 연관된 대상을 바꿀 수 없다.]

2.4.4 constexpr 및 상수 표현식(추가 예정)


[상량표현식은 값이 변하지 않고 컴파일 과정에서 계산 결과를 얻을 수 있는 표현식, 즉 컴파일 기간 상량, 예를 들어 글자값, 상량표현식으로 초기화된const 대상을 가리킨다.
c++ 언어 중 몇 가지 경우 상수 표현식을 사용해야 합니까?
일반적으로 변수가 상수 표현식이라고 인정하면constexpr 형식으로 표시합니다.
[하나의 대상(또는 표현식)이 상수 표현식인지 아닌지는 그의 데이터 형식과 초기 값이 공동으로 결정한다.
데이터 유형은 상수여야 합니다.
초기 값은 프로그램이 실행될 때의 입력에 의존하지 않아야 합니다. 예를 들어 다음과 같습니다.
const int sz = get_size();

sz는 상수이지만 초기 값은 프로그램이 실행될 때만 얻을 수 있습니다.
[복잡한 시스템에서는 초기 값이 상수 표현식인지 아닌지를 분별하기 어렵다.
c++ 새 표준은 컴파일러가 변수의 값이 상수 표현식인지 확인하기 위해 변수를 constexpr 형식으로 표시할 수 있도록 합니다. (constexpr의 의미 중 하나)
constexpr로 성명된 변수는 반드시 상수이며, 상수 표현식을 사용하여 초기화해야 합니다.
다음 코드에는 컴파일 지식이 포함되어 있습니다.
constexpr int mf = 20;//20 
constexpr int limit = mf + 1;//mf + 1  ,mf  , mf  mf  
constexpr int sz = size();// size  constexpr  ,  
int i = 0;// i  , 
constexpr int a = i;// , i  mf  , a  

새 표준은 특수한 constexpr 함수 (6.5.2) 를 정의할 수 있습니다. 이 함수는 컴파일할 때 그 결과를 계산할 수 있도록 간단해야 합니다. 그러면 constexpr 함수로 constexpr 변수를 초기화할 수 있습니다.
[상량 표현식은 컴파일할 때 계산을 받아야 하기 때문에constexpr로 성명되는 변수 형식은 제한이 있어야 합니다.
이러한 유형은 일반적으로 충분하게 간단하고 값이 뚜렷하며 쉽게 얻을 수 있다. (표현식으로 사용되기 때문에 반드시 쉽게 얻을 수 있는 값이 있어야 하기 때문이다.) 이를 '액면가 유형' 이라고 부른다.
산술 유형, 인용, 지침은 모두 액면가 유형에 속하며, 기타 일부 액면가 유형은 7.5.6과 19.3에 소개될 것이다.
[지침과 인용은constexpr 형식으로 정의할 수 있지만 엄격한 제한을 받아야 합니다.
constexpr 포인터의 초기 값은nullptr 또는 0이어야 하며, 일정한 주소에 저장된 대상을 가리켜야 합니다. (변수 주소는 프로그램이 실행되는 상태에 따라 달라질 수 없습니다.)
6.1.1절에서는 변수 주소의 고정 여부와 해당 변수의 위치를 정의하는 관계 및 기타 규정을 소개합니다.]
[const와 달리 constexpr을 사용하여 바늘의 유형을 설명할 때 constexpr 한정 문자는 바늘에만 유효하며 바늘이 가리키는 대상과 무관하다.
const int *p = nullptr;//p  
constexpr int *q = nullptr;//q  
constexpr int i = 0;//i  , 
constexpr const int *r = &i;//r  

좋은 웹페이지 즐겨찾기