C ++ 클래스에서 닫는 중괄호 뒤에 세미콜론이있는 이유는 무엇입니까? 나는 정기적으로 그것을 잊어 버리고 컴파일러 오류가 발생하여 시간을 낭비합니다. 나에게는 다소 불필요한 것처럼 보이지만 그럴 것 같지 않습니다. 사람들이 정말로 다음과 같은 일을합니까?
class MyClass
{
.
.
.
} MyInstance;
구조체와 열거 형에 대한 C 호환성 관점에서 얻었지만 클래스는 C 언어의 일부가 아니기 때문에 주로 비슷한 선언 구문 사이의 일관성 유지에 있다고 생각합니다.
내가 찾던 것은 무엇이든 변경할 수있는 것보다 디자인 근거와 더 관련이 있었지만, 좋은 코드 완성 IDE는 컴파일 전에 이것을 트랩 할 수 있습니다.
답변
유형 선언에서 닫는 중괄호 뒤의 세미콜론은 언어에 필요합니다. C의 초기 버전 이후로 그렇게되었습니다.
그리고 예, 사람들은 실제로 당신이 거기에 올린 선언을합니다. 메서드 내에서 범위가 지정된 유형을 만드는 데 유용합니다.
void Example() {
struct { int x; } s1;
s1.x = 42;
struct ADifferentType { int x; };
}
이 경우 세미콜론이 필요한 이유가 분명하다고 생각합니다. 헤더 파일에서 선언하는 더 일반적인 경우에 왜 필요한지 잘 모르겠습니다. 내 생각 엔 그것이 역사적이고 컴파일러를 더 쉽게 작성하기 위해 수행되었다는 것입니다.
답변
링크 @MichaelHaren에 의해 제공은 제공하기 위해 나타납니다 근본 원인을 . 세미콜론 (다른 사람들이 지적했듯이)은 C에서 상속되었습니다. 그러나 이것이 C가 처음에 세미콜론을 사용한 이유를 설명하지 않습니다. 토론에는 다음과 같은 예제가 포함됩니다.
struct fred { int x; long y; };
main()
{
return 0;
}
이전 버전의 C는 달리 선언하지 않는 한 함수에서 암시 적 int 반환 유형을 가졌습니다. ;
구조체 정의의 끝에서 를 생략하면 새로운 유형을 정의 할 fred
뿐만 아니라 main()
인스턴스를 반환 할 것을 선언하는 것입니다 fred
. 즉 코드는 다음과 같이 구문 분석됩니다.
struct fred { int x; long y; } main()
{
return 0; /* invalid return type, expected fred type */
}
답변
클래스는 그룹화를 위해 중괄호가 필요한 경우에도 선언이기 때문이라고 생각합니다. 그리고 예, C에서 할 수있는 역사적 주장이 있습니다.
struct
{
float x;
float y;
} point;
C ++에서 비슷한 작업을 수행 할 수 있어야합니다. class
선언이 동일한 방식으로 작동 하는 것이 합리적입니다 .
답변
짧습니다.
class MyClass
{
.
.
.
};
// instance declaration
MyClass MyInstance; // semicolon here
클래스 선언의 중괄호 뒤의 세미콜론은 실제로 과잉이지만 C ++가 정의되는 방식입니다. 변수 선언 뒤의 세미콜론은 항상 필요하며 의미가 있습니다.
답변
나는 그러한 선언을 사용하지 않는다
class MyClass
{
.
.
.
} MyInstance;
하지만이 경우에 세미콜론이있는 이유를 이해할 수 있습니다.
그것은 int a;
변수 선언 과 같기 때문입니다 .
아마도 일관성을 위해 ‘MyInstance’세미콜론을 생략 할 수 있습니다.
답변
struct
호환성을 위해 뒤에 필요 하며 어떻게 하시겠습니까?
struct MyStruct { ... };
class MyClass { ... } //inconsistency
답변
C / C ++에서; 문 종결 자입니다. 모든 문은; 모호함을 방지하고 구문 분석을 단순화합니다. 문법은이 점에서 일관성이 있습니다. 클래스 선언 (또는 해당 문제에 대한 모든 블록)이 여러 줄이고 {}로 구분되어 있어도 여전히 단순히 명령문 ({}은 명령문의 일부 임)이므로 다음으로 종료해야합니다. (;은 구분자 / 구분자가 아님)
귀하의 예에서
class MyClass{...} MyInstance;
완전한 진술입니다. 하나의 명령문에서 선언 된 클래스의 여러 인스턴스를 정의 할 수 있습니다.
class MyClass{...} MyInstance1, MyInstance2;
이것은 단일 문에서 기본 유형의 여러 인스턴스를 선언하는 것과 완전히 일치합니다.
int a, b, c;
클래스와 인스턴스의 이러한 선언을 자주 보지 못하는 이유는 인스턴스가 “오직”할 수 있습니까? 전역 변수이고 정적 및 / 또는 Plain Old Data 구조가 아니면 전역 개체를 원하지 않는 경우가 많습니다.