>  기사  >  백엔드 개발  >  직접 초기화 구문을 사용하여 C에서 클래스 데이터 멤버를 초기화할 수 없는 이유는 무엇입니까?

직접 초기화 구문을 사용하여 C에서 클래스 데이터 멤버를 초기화할 수 없는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-17 16:10:02245검색

Why can't I initialize class data members in C   using direct initialization syntax?

직접 구문을 사용한 클래스 데이터 멤버 초기화가 C에서 금지되는 이유

프로그래머는 로컬 초기화 구문과 유사하게 직접 초기화 구문을 사용하여 클래스 데이터 멤버에 값을 할당할 수 없는 이유를 궁금해할 수 있습니다. 변수는 할 수 있습니다. 다음 예를 고려하십시오.

class test
{
    public:
        void fun()
        {
            int a(3);
            std::cout << a << '\n';
        }
    private:
        int s(3);    // Compiler error: Why???
};

이 코드를 컴파일할 때 오류가 발생합니다.

11    9 [Error] expected identifier before numeric constant
11    9 [Error] expected ',' or '...' before numeric constant

왜 이런 일이 발생합니까? 클래스 데이터 멤버 초기화에 대한 C 표준의 입장을 검토해 보겠습니다.

파싱 모호성

직접 초기화 구문에 대한 초기 제안에서는 파싱 문제를 방지하기 위해 제외되었다고 설명했습니다. 예를 들어 다음 코드를 고려해보세요.

struct S {
    int i(x); // data member with initializer
    // ...
    static int x;
};

struct T {
    int i(x); // member function declaration
    // ...
    typedef int x;
};

직접 초기화가 허용된 경우 구조체 S 선언의 구문 분석이 모호해집니다. 컴파일러는 int i(x)를 해석할 수 있습니다. 초기화자가 있는 데이터 멤버 또는 매개변수가 있는 멤버 함수 선언으로.

기존 해결 규칙

한 가지 해결책은 선언이 두 가지로 해석될 수 있다는 규칙에 의존하는 것입니다. 객체와 함수는 함수로 취급되어야 합니다. 그러나 이 규칙은 블록 범위 선언에 대해 이미 존재하므로 혼란을 초래할 수 있습니다.

struct S {
    int i(j); // ill-formed...parsed as a member function,
              // type j looked up but not found
    // ...
    static int j;
};

또 다른 해결책은 선언이 유형과 다른 것으로 해석될 수 있는 경우 규칙을 사용하는 것입니다. 후자로 취급됩니다. 다시 한 번 말씀드리지만, 이 규칙은 템플릿에 대해 이미 존재합니다.

struct S {
    int i(x); // unabmiguously a data member
    int j(typename y); // unabmiguously a member function
};

그러나 두 솔루션 모두 오해를 불러일으키는 미묘한 문제를 야기합니다.

제안된 솔루션

이러한 모호성을 해결하려면, C 표준에서는 다음 형식의 초기화만 허용하도록 제안했습니다.

  • = 초기화 절
  • { 초기화 목록 }

이는 다음 형식의 모호성을 해결합니다. 대부분의 경우 추가 규칙이 필요하지 않습니다.

요약하면 C에서 클래스 데이터 멤버에 대한 직접 초기화 구문을 금지하는 이유는 데이터 멤버와 데이터 멤버 모두를 포함하는 복잡한 데이터 구조를 선언하는 동안 발생할 수 있는 모호성을 구문 분석하는 데서 비롯됩니다. 유사한 시그니처를 가진 함수 선언 또는 유형 정의.

위 내용은 직접 초기화 구문을 사용하여 C에서 클래스 데이터 멤버를 초기화할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.