C ++에서 변수를 선언 할 때 변수 이름을 괄호로 묶을 수있는 이유는 무엇입니까?
예를 들어 다음과 같은 선언이 있습니다.
int (x) = 0;
또는 그것도 :
int (((x))) = 0;
내 코드에서 다음과 비슷한 조각이 있었기 때문에 이것을 우연히 발견했습니다.
struct B
{
};
struct C
{
C (B *) {}
void f () {};
};
int main()
{
B *y;
C (y);
}
분명히 나는 C
소멸자에서 유용한 것을 할 객체 를 만들고 싶었습니다 . 그러나 컴파일러는 유형 C (y);
이있는 변수의 선언으로 처리 하므로 재정의에 대한 오류를 인쇄합니다 . 재미있는 것은 내가로 작성하는 경우이다 또는 무언가로 같이 가 의도 한대로 컴파일. 가장 현대적인 해결 방법은 물론 생성자 호출 에 사용하는 것 입니다.y
C
y
C (y).f ()
C (static_cast<B*> (y))
{}
그래서 내가 그 후에 알아 냈 듯이 변수를 같은 int (x) = 0;
또는 심지어 선언하는 것이 가능 int (((x))) = 0;
하지만 실제로 이와 같은 선언을 사용하는 사람을 본 적이 없습니다. 그래서 저는 관심이 있습니다. 현재로서는 악명 높은 "가장 성가신 구문 분석"과 유사한 경우 만 생성하고 유용한 정보를 추가하지 않기 때문에 그러한 가능성의 목적은 무엇입니까?
그룹화.
특정 예로서, 다음과 같은 함수 유형의 변수를 선언 할 수 있습니다.
int f(int);
자, 그런 것에 대한 포인터를 어떻게 선언 하시겠습니까?
int *f(int);
아니, 작동하지 않습니다! 이것은를 반환하는 함수로 해석됩니다 int*
. 올바른 방법으로 구문 분석하려면 괄호를 추가해야합니다.
int (*f)(int);
배열도 마찬가지입니다.
int *x[5]; // array of five int*
int (*x)[5]; // pointer to array of five int
구문상의 관점에서 볼 때 선언은 항상 다음과 같이 보이기 때문에 일반적으로 이러한 선언에 괄호를 사용할 수 있습니다.
<front type> <specification>;
예를 들어, 다음 선언에서 :
int* p[2];
"전면 유형"은 int
(아님 int*
)이고 "사양"은 * p[2]
입니다.
규칙은 "규격"부분에 필요한만큼의 괄호를 사용할 수 있다는 것입니다. 괄호는 때때로 명확하게하기 위해 불가피하기 때문입니다. 예를 들면 :
int* p[2]; // array of 2 pointers to int; same as int (*p[2]);
int (*p)[2]; // pointer to an array of 2 ints
배열에 대한 포인터는 드물지만 함수에 대한 포인터와 동일한 상황입니다.
int (*func(int)); // declares a function returning int*
int (*func)(int); // declares a pointer to function returning int
이것은 귀하의 질문에 대한 직접적인 대답입니다. 질문이과 같은 진술에 관한 C(y)
것이라면 :
- 전체 표현식을 괄호로 묶으
(C(y))
면 원하는 것을 얻을 수 있습니다. - This statement does nothing but creating a temporary object, which ceases to living after this instruction ends (I hope this is what you intended to do).
'Programing' 카테고리의 다른 글
IDisposable 개체 참조가 삭제되었는지 어떻게 알 수 있습니까? (0) | 2020.10.06 |
---|---|
CSS에서 픽셀로 작업하는 것이 좋지 않습니까? (0) | 2020.10.06 |
SQL Server 데이터베이스를 MySQL로 내보내는 방법은 무엇입니까? (0) | 2020.10.06 |
메모리에 새 java.io.File을 만드는 방법은 무엇입니까? (0) | 2020.10.06 |
MySQL 데이터베이스를 MS SQL Server로 가져 오기 (0) | 2020.10.06 |