C / C ++ 구조체 대 클래스


108

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

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

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

c++  class  struct 


답변:


146

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

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

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


OOP에서 예상되는 .Net 사람들은 이것을 이렇게 정의했습니다. ✓ 유형의 인스턴스가 작고 일반적으로 수명이 짧거나 일반적으로 다른 객체에 포함되는 경우 클래스 대신 구조체를 정의하는 것을 고려하십시오. X 형식이 다음 특성을 모두 갖지 않는 한 구조체 정의를 피합니다. 1. 기본 형식 (int, double 등)과 유사한 단일 값을 논리적으로 나타냅니다. 2. 인스턴스 크기가 16 바이트 미만입니다. 3. 불변입니다.
Abhijeet 2015

5
@Abhijeet 이것이 C #에서 구조체와 클래스를 구분하는 것입니다. 그러나 이것은 단순히 C ++와는 무관하며 C와는 더 관련이 없습니다. C #에서는 클래스와 구조체가 실제로 다릅니다. C ++에서는 그렇지 않으며 C에는 OO가없는 구조체 만 있습니다.
Antal Spector-Zabusky 2015

C ++ 구조체에서 동일한 C 의미를 유지하는 것이 낫지 않을까요? "C ++ 방식의 구조체"를 사용해야 할 때 클래스를 사용합니까? 저는 C에 비해 C ++에서 "증강 된"구조체를 갖는 이점을 얻지 못했습니다. 저는 여전히 C에서 설계된대로 구조체를 사용하는 것을 좋아합니다. 그렇지 않으면 일부 예외가 허용되는 클래스를 사용합니다.
Raffaello

15

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

그러나 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에서만 작동


9
C 코드에서 CPP 키워드를 사용하고 호환 CPP되지 주장하는 것은 오히려 바보입니다
대니

7

최신 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는 그다지 유용하지 않습니다.


또 다른 고려 사항은 이식성입니다. structs는 가장 휴대 성이 뛰어납니다. C 또는 C ++ 또는 앞뒤로 사용할 수 있습니다. struct예를 들어 모듈을 사용하여 Python에서 압축을 풀 수도 있습니다 . 프로젝트의 우선 순위를 다른 언어, 인터페이스 나 시스템과 호환되는 경우, 선호 struct이상 class. 엄격하게 프로그램 내부 문제의 경우 class.
Dave

6

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

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


템플릿 등이 C에 존재하지 않는다는 것을 알고 있지만 C power의 구조체를 알지 못했습니다 . 그러면 C ++는 구조체 만 C와 '역방향'호환되도록 구조체를 사용합니까?

4
이전 버전과의 호환성을 위해서? 실제적으로는 뭔가가있을 수 있지만, 그 구분은 의도의 신호일 수 있습니다. 제가 사용하는 struct곳에서는 주로 수동적 인 POD 유형의 사물을 의미합니다.
dmckee --- 전 중재자 새끼 고양이

@dmckee : 가치가있는 대부분의 STL 펑터 (예 :) std::less는 클래스가 아닌 구조체로 정의됩니다.
Billy ONeal

1
C ++는 C와 완전히 호환되지 않습니다. struct 키워드가 C 개발자를위한 편의라고 말할 수 있습니다. 나는 단순히 정렬 된 방식으로 데이터를 보유하지만 (많은) 로직을 제공하지 않는 클래스에 대한 struct 키워드를 좋아합니다.
ypnos

@ypnos : 내 마지막 댓글을 참조하세요. 둘 사이의 유일한 차이점은 한 구성원은 기본 공개이고 다른 구성원은 기본 비공개라는 것입니다.
Billy ONeal

3

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


1

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


2
그만한 가치가있는 대부분의 STL 펑터 (예 :) std::less는 클래스가 아닌 구조체로 정의됩니다.
Billy ONeal

3
C ++ 구조체에는 메서드, 상속 및 가시성이 있습니다.
robertwb

c 구조체는 type (* addr) (params);
오류
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.