전통문화대전망 - 전통 미덕 - C++ 판단 방법 별칭을 구별하는 방법

C++ 판단 방법 별칭을 구별하는 방법

프로그램이 복잡해짐에 따라 프로그램에 사용되는 유형도 점점 복잡해지고 있습니다. 이 복잡성은 두 가지 측면에 반영됩니다. 첫째, 일부 유형은' 철자' 하기 어렵고, 그들의 이름은 기억하기 어렵고, 잘못 쓰기가 쉬우며, 실제 목적과 의미를 명확하게 반영하지 못한다. 둘째, 때로는 필요한 유형이 무엇인지 전혀 알 수 없을 때가 있다. 프로그래머는 어쩔 수 없이 프로그램의 문맥에서 도움을 구해야 한다.

1, 유형 별칭

유형 별칭 (type alias) 은 일종의 동의어인 이름입니다. 유형 별칭을 사용하면 복잡한 유형 이름을 쉽고, 쉽게 이해하고 사용할 수 있으며, 프로그래머가 해당 유형을 사용하는 실제 목적을 명확하게 알 수 있다는 장점이 많습니다.

유형 별칭을 정의하는 두 가지 방법이 있습니다. 기존 방법은 키워드 typedef:

typedef double wages; //wages 는 double 과 동의어입니다. 즉 double

typedef wages base, *p; 대신 wages 를 입력할 수 있습니다 //base 는 double 의 동의어이고 p 는 double* 의 동의어

1

2

typedef 를 포함하는 선언문은 더 이상 변수가 아니라 유형 별칭을 정의합니다.

1.C++11 새 표기법

C++11 새 표준은 별칭 선언을 사용하여 유형의 별칭을 정의하는 새로운 표기법을 제공합니다.

using SI = Salse_item; //si 는 Salse_item 의 동의어

1

입니다. 이 방법에서는 using 키워드를 별칭 선언의 시작으로 사용하고 그 뒤에 별칭과 등호가 옵니다. 등호의 왼쪽에 있는 이름을 등호의 오른쪽 유형에 대한 별칭으로 지정하는 것입니다.

2. 유형 별칭 및 유형 이름 사용 범위

유형 별칭 및 유형 이름 같음, 유형 이름이 나타날 수 있는 한 유형 별칭 사용 가능:

wages hourly, weekly; //는 double hourly,weekly; 와 같습니다.

siitem; //는 salse _ itemitem 과 같습니다.

1

2

2, 포인터, 상수 및 유형 별칭 < P > 특정 유형의 별칭이 복합 유형이나 상수를 참조하는 경우 선언문에 사용하면 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 다음 선언문에서는 유형 pstring 을 사용합니다. 이는 실제로 유형 char* 의 별칭입니다.

typedef char *pstring;

const pstring CSTR = ; //CSTR 은 char 에 대한 상수 포인터

const pstring *ps =; //PS 는 char 상수 포인터

1

2

3

위의 두 선언문에 대한 기본 데이터 유형이 const pstring 이고 const 는 지정된 유형에 대한 수식입니다. Pstring 은 실제로 char 에 대한 포인터이므로 const pstring 은 상수 문자가 아닌 char 에 대한 상수 포인터입니다.

유형 별칭을 사용하는 선언문을 만나면

const char *cstr = ; //는 const pstring CSTR 에 대한 잘못된 이해

1

선언문에 pstring 이 사용된 경우 기본 데이터 유형은 포인터입니다. 그러나 char* 로 선언문을 다시 작성하면 데이터 유형은 char 이 되고 * 는 선언자의 일부가 됩니다. 결과를 const char 로 변경하여 기본 데이터 유형이 됩니다. 앞뒤 두 선언의 의미는 확연히 다르다. 즉, char 에 대한 상수 포인터를 선언하고, 개정된 형식은 const char 에 대한 포인터를 선언한다. < P > 3, 자동 유형 지정자 < P > 는 표현식의 데이터 유형을 알 수 없는 경우가 있습니다. C++11 새 표준은 컴파일러가 표현식이 속한 유형을 분석할 수 있도록 하는 자동 유형 지정자를 도입했습니다. Double 과 같은 특정 유형의 지정자 중 하나에만 해당하는 원래 지정자 (예: Double) 와 달리 auto 를 사용하면 컴파일러에서 초기 값을 통해 변수 유형을 추정할 수 있습니다. 분명히 auto 정의 변수에는 초기 값이 있어야 합니다.

// vall 과 vall2 에 의해 추가된 결과는 item 유형

auto item = vall+vall2 를 추정할 수 있습니다. //item 을 vall 및 vall2 향수병으로 초기화한 결과

1

2

컴파일러는 vall 과 vall2 를 더한 결과를 기준으로 item 유형을 추론합니다. Vall 과 vall2 가 Sales_item 클래스의 객체인 경우 item 유형은 Sales_item 입니다. 두 변수가 모두 double 이면 item 유형은 double 입니다.

1. auto 유형 사용에 대한 참고 사항

auto 를 사용하면 한 문에 여러 변수를 선언할 수도 있습니다. 선언문에는 하나의 기본 데이터 유형만 있을 수 있으므로 명령문의 모든 변수에 대한 초기 기본 데이터 유형은

auto I = , *p = & 와 같아야 합니다 I; //정답: I 는 정수이고 p 는 정수 포인터

auto SZ = , pi =3.14; //오류: SZ 와 pi 의 유형이 일치하지 않습니다. 하나는 int 이고, 하나는 double

1

2

4 이고, decltype 유형 표시기

는 때때로 표현식 유형에서 정의할 변수 유형을 추론하려고 합니다 이러한 요구 사항을 충족하기 위해 C++11 새 표준에서는 피연산자의 데이터 유형을 선택하고 반환하는 두 번째 유형 지정자 decltype 을 도입했습니다. 이 과정에서 컴파일러는 표현식을 분석하고 유형을 가져오지만 표현식의 값은 실제로 계산하지 않습니다.

decltype((f()) sum = x; / //sum 유형은 함수 f 의 반환 유형

1

컴파일러가 실제로 함수 f 를 호출하는 것이 아니라 호출이 발생할 때 f 의 반환 값 유형을 sum 유형으로 사용하는 것입니다. 즉, 컴파일러가 sum 에 지정한 유형은 무엇입니까? F 가 호출되면 반환될 유형입니다.

1.decltype 및 참조

일부 표현식은 decltype 에 참조 유형을 반환합니다. 일반적으로 이 경우 표현식의 결과 객체가 대입문의 왼쪽 값으로 사용될 수 있음을 의미합니다.

//decltype 의 결과는 참조 유형 <; I, & R = I;

decltype(r+) b : //정답: 덧셈의 결과는 int 이므로 b 는 초기화되지 않은 int

decltype(*p) c; //오류: c 는 int& ,

1

2

3

4

2.decltype 과 auto 차이

decltype 과 auto 의 또 다른 중요한 차이인 decltype 을 초기화해야 합니다

//decltype 에 대한 표현식 괄호 안에 변수를 추가하면 결과는

int I = 42; 를 참조합니다

decltype((i)) d; //오류: d 는 int& ,

decltype(i) e 를 초기화해야 합니다. //정답: e 는 초기화되지 않은 int

1

2

3

4

의 코드 분석입니다. decltype 이 괄호 없는 변수를 사용하면 그 결과는 변수 유형입니다 변수는 대입문의 왼쪽 값으로 사용할 수 있는 특수 표현식이므로 이러한 decltype 은 참조 유형을 가져옵니다.

PS: decltype ((변수)) (이중 괄호 참고) 의 결과는 항상 참조이고 decltype (변수) 의 결과는 변수 자체가 참조인 경우에만

를 참조합니다

원본 링크:/QQ _ 3539297/article/details/115599