C / C ++ 구조체 대 클래스 가지고 있다는

내 C ++ 클래스를 마친 후 몇 가지 사소한 차이점을 제외하고는 구조체 / 클래스가 사실상 동일 해 보였습니다.

나는 전에 C로 프로그래밍 한 적이 없다. 그러나 나는 그것이 구조체를 가지고 있다는 것을 압니다. C에서 다른 구조체를 상속하고 public / private의 수정자를 설정할 수 있습니까?

일반 C에서 이것을 할 수 있다면 왜 우리는 C ++가 필요합니까? 클래스가 구조체와 다른 점은 무엇입니까?



답변

C ++ 에서 구조체와 클래스는 거의 동일합니다. 유일한 차이점은 클래스의 액세스 수정 자 (멤버 변수, 메서드 및 기본 클래스의 경우)가 기본적으로 private로 설정되고 구조체의 액세스 수정자가 기본적으로 public으로 설정된다는 것입니다.

그러나 C 에서 구조체는 (공용) 데이터의 집계 모음 일 뿐이며 다른 클래스와 유사한 기능이 없습니다. 메서드 없음, 생성자 없음, 기본 클래스 없음 등. C ++에서 키워드를 상속했지만 의미 체계를 확장했습니다. (그러나 이것이 구조체에서 기본적으로 public으로 설정되는 이유입니다. C 구조체처럼 작성된 구조체는 하나처럼 동작합니다.)

예를 들어, 구조체에 대한 포인터를 모두 첫 번째 매개 변수로 사용하는 함수를 정의하거나 때때로 동일한 처음 몇 개의 필드가있는 구조체를 “하위 / 슈퍼 클래스”로 강제 하는 등 C에서 일부 OOP를 가짜로 만들 수 있지만 항상 일종의 고정되어 있으며 실제로 언어의 일부가 아닙니다.


답변

기본 액세스 (공개 / 개인)의 차이 외에는 차이가 없습니다.

그러나 C 및 C ++로 코딩하는 일부 상점에서는 “class / struct”를 사용하여 C 및 C ++ (struct)에서 사용할 수 있고 C ++ 전용 (클래스)임을 나타냅니다. 즉,이 스타일에서는 모든 구조체가 C 및 C ++에서 작동해야합니다. 이것이 C ++이 여전히 “C with Classes”로 알려졌을 때 처음부터 차이가 있었던 이유입니다.

C 공용체는 C ++에서 작동하지만 그 반대는 작동하지 않습니다. 예를 들면

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

그리고 마찬가지로

typedef union friend{
    int a;
    float b;
} class;

C에서만 작동


답변

최신 C ++ 는 이제 하나의 공식 핵심 지침 이므로 기존 답변에 추가 할 것입니다. 이러한 질문에 도움이되는 이 만들어 입니다.

다음은 가이드 라인의 관련 섹션입니다.

C.2 : 클래스에 불변성이 있으면 클래스를 사용하십시오. 데이터 멤버가 독립적으로 다를 수있는 경우 struct 사용

불변은 생성자가 공용 멤버 함수가 가정하기 위해 설정해야하는 객체 멤버에 대한 논리적 조건입니다. 불변이 설정되면 (일반적으로 생성자에 의해) 모든 멤버 함수가 개체에 대해 호출 될 수 있습니다. 불변성은 비공식적으로 (예 : 코멘트에서) 또는보다 공식적으로 Expects를 사용하여 언급 될 수 있습니다.

모든 데이터 멤버가 서로 독립적으로 다를 수있는 경우 불변이 불가능합니다.

클래스에 개인 데이터가있는 경우 사용자는 생성자를 사용하지 않고 객체를 완전히 초기화 할 수 없습니다. 따라서 클래스 정의자는 생성자를 제공하고 그 의미를 지정해야합니다. 이것은 정의자가 불변을 정의해야 함을 의미합니다.

시행

모든 데이터 개인용 구조체와 공용 멤버가있는 클래스를 찾습니다.

주어진 코드 예제 :

struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

Class예를 들어, 서로 파생되거나 상호 관련된 구성원에게 적합합니다. 또한 인스턴스화시 온 전성 검사에 도움이 될 수 있습니다.Structs는 “데이터 가방”을 갖는 데 적합합니다. 특별한 일은 없지만 구성원이 논리적으로 함께 그룹화되는 것이 합리적입니다.

이것으로부터 class캡슐화 및 기타 관련 코딩 개념을 지원하기 위해 존재 하는 것이 합리적이며 , structs는 그다지 유용하지 않습니다.


답변

C에서 멤버 함수를 정의하거나 서로로부터 구조체를 파생하는 것은 불가능합니다.

또한 C ++는 C + “파생 구조체”만이 아닙니다. 템플릿, 참조, 사용자 정의 네임 스페이스 및 연산자 오버로딩은 모두 C에 존재하지 않습니다.


답변

C ++의 또 다른 차이점은 액세스 지정자없이 구조체에서 클래스를 상속하면 공용 상속이되고 클래스의 경우 개인 상속이됩니다.


답변

C ++는 주로 1) C와의 하위 호환성 및 2) POD 유형을 위해 구조체를 사용합니다. C 구조체에는 메서드, 상속 또는 가시성이 없습니다.


답변