C ++에서 클래스와 구조체를 언제 사용해야합니까?


949

어떤 시나리오 에서 C ++에서 structvs 를 사용하는 것이 더 낫 class습니까?


47
이것은 C ++에만 적용되는 것이 아니라 구조체와 클래스를 모두 제공하는 모든 언어에 적용됩니다.
Jason Bunting

3
나는 여전히 동의하지 않습니다-나는이 질문에 의미 론적으로 접근합니다. 어쩌면 기술적 차이가있을 수도 있지만 의미 상 차이는 없습니다. Structs는 값 유형을 만드는 데 실제로 유용하지만 클래스는 그렇지 않습니다.
Jason Bunting

4
C ++에서 구조체를 사용하는 심각한 이유가 없다고 생각합니다. 나에게 구조체는 typedef와 같이 C와의 호환성을 위해서만 존재하는 또 다른 중복 C ++ 기능입니다. C ++가 처음에 C의 확장으로 처리되지 않았고 Java와 같이 처음부터 디자인 된 경우에는 존재하지 않습니다. 일반적으로 C ++에서 가장 이상한 점은 C 호환성과 관련이 있다는 것을 알았습니다.
코스타스

5
구조-POD (일반 데이터) 및 모든 멤버 액세스 가능성이 공개입니다. 클래스-더 나은 캡슐화가 필요하고 클래스의 상태에 대해 작업하기 위해 멤버 함수가 필요한 경우
Navaneeth KN

4
이것은 관례에 의해서만 적용됩니다. 기본 캡슐화 외에는 차이가 없습니다.
Dave Hillier

답변:


804

C ++에서 a class와 a의 차이점은 struct구조체에 기본 public멤버와 기본이 있고 클래스에는 기본 private멤버와 기본이 있다는 것입니다. 두 클래스와 구조체는의 혼합물을 가질 수 있습니다 public, protected그리고 private회원들은 상속을 사용할 수 있으며 멤버 함수를 가질 수 있습니다.

클래스와 같은 기능이없는 평범한 데이터 구조로 구조체를 사용하고 private데이터 및 멤버 함수가있는 집계 데이터 구조로 클래스를 사용하는 것이 좋습니다 .


99
수정 자나 메소드가없는 구조체를 POD 구조체라고합니다.이 구조체는 C 구조체 인 것처럼 배치되도록 보장되므로 C 라이브러리와 호환되는 하위 인터페이스로 존재합니다. 그러나이 예외를 제외하고 유일한 차이점은 명시된 바와 같습니다.
workmad3

26
@ workmad3 : 이름이 잘못되었지만 9/4 (C ++ 03)는 다음과 같이 말합니다. "POD-struct는 non-POD-struct, non-POD-union 유형의 비 정적 데이터 멤버가없는 집계 클래스입니다. (또는 이러한 유형의 배열) 또는 참조이며 사용자 정의 사본 할당 연산자 및 사용자 정의 소멸자가 없습니다. " "struct"클래스 키 사용에는 제한이없고 "public"사용에는 제한이 없습니다 (집계 요구 사항은 8.5.1 / 1 참조). 이것은 "struct"와 "class"의 차이점이 아닙니다.

5
표준의 정의에 따라 "집계"를 사용하는 것이 잘못 이해 될 수 있습니다. :)

3
Stroustrup의 "원칙과 실습"책에 따르면 : "구조는 주로 구성원들이 어떤 가치를 가질 수있는 곳에서 사용되어야한다"(즉, 의미있는 클래스 불변성을 정의 할 수없는 곳)
antibus

6
물론 C와 인터페이스 할 때 클래스를 사용할 수 있습니다. 클래스와 구조체 사이에는 차이가 없습니다. 구조는 클래스입니다. 기본 액세스 만 개인에서 공용으로 전환됩니다.
Sebastian Mach

229

다른 사람들이 지적했듯이 실제로 두 가지 실제 언어 차이가 있습니다.

  • struct기본적으로 공개 액세스로, class기본적으로 개인 액세스로 설정됩니다.
  • 상속 할 때 struct기본값은 public상속이고 class기본값은 private상속입니다. (C ++의 많은 것들과 마찬가지로, 기본적으로 거꾸로되어 있습니다. public상속은 훨씬 일반적인 선택이지만 사람들 struct은 " public"키워드 를 입력하는 것을 막기 위해 거의 선언하지 않습니다 .

그러나 실제로 진짜 차이는 사이에 class/ struct하지 않는 생성자 / 소멸자를 선언 한. "일반 데이터"POD 유형에 대한 보증이 있으며, 클래스 구성을 인수 한 후에는 더 이상 적용되지 않습니다. 이러한 차이를 명확하게 유지하기 위해 많은 사람들이 의도적으로 structPOD 유형 에만 s를 사용 하고, 메소드를 추가하려는 경우 classes를 사용 합니다. 아래 두 조각의 차이점은 의미가 없습니다.

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(우연히, 여기에 "POD 유형"이 실제로 무엇을 의미하는지에 대한 좋은 설명이있는 스레드가 있습니다 : C ++의 POD 유형은 무엇입니까? )


상속 차이점에 관한 좋은 예 : here .
Liran Orevi

8
당신은 사용 여부 struct또는 class개체가 POD 여부에 관계가 없습니다하거나 복사 생성자 / 소멸자를 정의할지 여부를 지정합니다. 멤버 함수는 또한 POD와 관련이 없습니다. 당신이 쓴 것을 다시 읽을 때, 당신이 다른 것을 제안하지는 않지만 현재의 말은 혼란 스럽습니다.
David Stone

1
@DavidStone 기본적으로, POD 구조체는 C 코드와 역 호환성을 보장해야하므로 기본적으로 C 스타일 구조체로 설계되어야합니다.
저스틴 타임-복원 모니카

3
이 답변의 "실제 차이"부분은 완전히 잘못되었습니다.
juanchopanza

177

기존 답변에는 많은 오해가 있습니다.

모두 classstruct클래스를 선언합니다.

예. 클래스를 선언하는 데 사용한 키워드에 따라 클래스 정의 내에서 액세스 수정 키워드를 다시 정렬해야 할 수도 있습니다.

그러나 구문을 넘어서서 하나를 다른 하나보다 선택해야하는 유일한 이유는 컨벤션 / 스타일 / 환경 설정입니다.

어떤 사람들은 struct멤버 함수가없는 클래스에 대한 키워드 를 고집하는 것을 좋아 합니다. 결과적인 정의는 C의 간단한 구조처럼 보입니다.

마찬가지로 일부 사람들 은 "클래스"라고 class하는 멤버 함수 및 private데이터가 포함 된 클래스에 키워드 를 사용하기를 좋아하므로 객체 지향 프로그래밍에 대한 좋아하는 책에서 예제처럼 보입니다.

현실은 이것이 당신과 당신의 팀에게 전적으로 달려 있으며, 그것은 당신의 프로그램에 문자 그대로 아무런 영향을 미치지 않을 것입니다.

다음 두 클래스는 이름을 제외한 모든면에서 완전히 동일합니다.

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

다시 선언 할 때 키워드를 전환 할 수도 있습니다.

class Foo;
struct Bar;

(이것은 부적합으로 인해 Visual Studio 빌드를 중단 하더라도이 작업을 수행 할 때 컴파일러에서 경고를 표시합니다.)

다음 표현식은 모두 true로 평가됩니다.

std::is_class<Foo>::value
std::is_class<Bar>::value

그러나 재정의 할 때 키워드를 전환 할 수는 없습니다 . 이는 (한 정의 규칙에 따라) 번역 단위에 걸쳐 클래스 정의가 중복 되어 "동일한 토큰 시퀀스로 구성 되어야 "하기 때문 입니다. 이 방법은 당신도 교환 할 수 const int member;와 함께 int const member;, 그리고 의미와는 아무 상관이 없습니다 class또는 struct.


15
이것은 매우 유익하고 정직하게 내가 가장 좋아하는 대답이었습니다. 다른 모든 사람들은 그것들을 별개의 실체로 취급하고 있습니다. Arduino 환경의 구조체 정의가 c ++ 클래스로 간주되어 g ++을 사용하여 컴파일 된 것으로 보았는지 궁금합니다.
Benjamin

4
@Ben 물론입니다. Arduino 컴파일러는 C ++를 컴파일합니다. 그 끝입니다.
underscore_d

6
따라서이 권리를 이해하고 있다면 가시성 수정자가 명시 적이며 생략되지 않는 한 중요하지 않습니다. 구조체 만 사용하여 거대한 C ++ 응용 프로그램을 작성할 수 있습니다. 또는 모든 구조체 사례를 수업으로 바꿀 수 있습니다. 기본 가시성을 사용하지 않는 한 응용 프로그램은 정확히 동일합니다.
Ryan Lundy

나는 C ++ 프로그램의 한 번역 단위가 완전한 선언 class foo { public: ... };을 가질 수 있고 또 다른 번역 단위 struct foo { ... };는 "절대적으로 동등한"주장에 따라 사실을 유지해야 한다는 것을 확신하지 못한다 . 불완전한 선언 struct foo;class foo;상호 교환 가능한 이유 가 있습니다. 이것들은 클래스 본문을 지정하지 않으므로 액세스 레이아웃에 아무 것도 말하지 않습니다.
Kaz

@Kaz : 맞습니다. 정의가 문자 그대로 동일한 유형 인 경우, 동작이 잘 정의되도록 어휘 적으로 동일해야합니다. 구조체 키클래스 키 달리 논리적 (의미론은 영향을받지 않는다) 교환 불구하고, FooBar정지 / 동일 유형 동등하다. 나는 " 재 선언 할 때 " 라고 말하고 예를 들었다 . 내가 UB에 있는지 내가 오해의 소지가 아니에요 사람들을 위해이 질문에 대해 답이 명확 것이다 그것을 생각 해 보 니,
궤도에 밝기 경주

54

클래스 대신 구조체를 사용하는 유일한 경우는 함수 호출에서 펑터를 사용하기 직전에 선언하고 명확성을 위해 구문을 최소화하려는 경우입니다. 예 :

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

35
몇 년 후 C ++ 11은 모든 주요 컴파일러에서 지원되므로 Lambdas는이를 더욱 간결하게 만듭니다.

36

로부터 C ++ FAQ 라이트 :

구조체의 멤버와 기본 클래스는 기본적으로 public이고 클래스에서는 기본적으로 private입니다. 참고 : 기본 클래스에 의존하지 않고 기본 클래스를 명시 적으로 공개, 개인 또는 보호로 설정해야합니다.

구조체와 클래스는 기능적으로 동일합니다.

으스스하고 깨끗한 테크노 대화는 충분합니다. 감정적으로, 대부분의 개발자는 클래스와 구조체를 강력하게 구분합니다. 구조체는 단순히 캡슐화 또는 기능 방식이 거의없는 열린 비트 더미처럼 느껴집니다. 클래스는 지능적인 서비스, 강력한 캡슐화 장벽 및 잘 정의 된 인터페이스를 갖춘 살아 있고 책임감있는 사회 구성원입니다. 그것이 대부분의 사람들이 이미 가지고있는 의미이므로, 메소드가 거의없고 공개 데이터가있는 클래스가있는 경우 struct 키워드를 사용해야합니다 (이러한 것들은 잘 설계된 시스템에 존재합니다!) 예어.


1
나는 그들이 왜 구조와 클래스가 기능적으로 동일하다는 것을 이해하고 있는지 이해하지 못하지만 어떤 경우에는 추론없이 다른 것을 선호한다고 말하고 있습니다.
deetz

3
그 이유는 컨벤션입니다. 컴파일러는 어떤 컴파일러를 사용하든 상관 없지만 코드를 살펴 보는 다른 개발자는 원하는 것을 이해하기가 더 쉽습니다.
탈 프레스 맨

3
@deetz : 세 번째 단락 전체가 추론입니다.
궤도에서 가벼움 경주

와우, '오래된 학교'에서 온 구조체에는 메소드와 상속이있을 수 있다는 것을 전혀 몰랐습니다. 메서드없이 데이터 만 사용할 때 항상 구조체를 사용했으며 일반적으로 구조체가 필요한 API 코드를 처리 할 때 사용했습니다. 구조체가 다중 상속도 지원할 수 있습니까?
Paul McCarthy

21

구조체가 나에게 도움이 된 곳은 다른 시스템에서 고정 형식 메시지 (예 : 직렬 포트)를받는 시스템이있을 때입니다. 바이트 스트림을 필드를 정의하는 구조체로 캐스트 한 다음 필드에 쉽게 액세스 할 수 있습니다.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

분명히 이것은 C에서와 같은 일이지만 메시지를 클래스로 디코딩 해야하는 오버 헤드는 일반적으로 가치가 없다는 것을 알았습니다.


동일은 C로 달성 될 수있다
유진 Bujak에게

11
또는 함수 operator >>를 작성하는 대신 클래스에서 구현할 processMessage수 있습니다. 그러면 C ++가 적절한 C ++처럼 보이고 C처럼 보이지 않게됩니다.
Nick Bastin

1
다른 시스템간에 이식 가능하지 않다는 사실 외에도 앨리어싱 규칙을 위반하므로 단일 아키텍처 내에서도 작동하지 않을 수 있습니다.
underscore_d

@underscore_d 플랫폼 (컴파일러는 아님)과 독립적으로 작동 할 수 있지만 고정 비트 필드, __packed__구조체 를 사용해야 하고 엔디안 인식 ifdef 구현이 있어야합니다 (엔디안이 외부 데이터 소스와 반대되는 시스템에서 순서를 뒤집어 야 함) 제공하고 있습니다). 예쁘지는 않지만 임베디드 플랫폼의 원격 주변 장치에 대한 레지스터를 휴대용으로 패키징 / 언 패킹하는 데 사용했습니다.
crasic

1
@jacwah Huh, 좋은 지적입니다. 포인터 중 하나가 char유형이므로 앨리어싱이 면제 되기 때문에 여기서 앨리어싱은 문제가되지 않습니다 . 그러나 여전히 다른 문제가 있지만 여전히 문제가 있습니다. char*해당 주소에서 이미 초기화 된 후자의 유형이없는 경우 수명 규칙을 위반하므로 UB입니다. Afaik은 대상 유형이 사소하게 구성 가능하더라도 C ++에서 메모리를 해당 유형으로 처리하는 데 공식적으로 메모리를 할당하는 것만으로는 충분하지 않습니다.
underscore_d

19

내부가 C ++ 인 라이브러리를 작성하고 있지만 C 또는 C ++ 코드로 API를 호출 할 수있는 경우 C ++에서 "struct"를 사용할 수 있습니다. C와 C ++ 코드 모두에 노출되는 구조체와 전역 API 함수를 포함하는 단일 헤더를 만들면됩니다.

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

그런 다음 C ++ 코드를 사용하여 C ++ 파일에 함수 bar ()를 작성하고 C에서 호출 가능하게 만들고 두 세계는 선언 된 구조체를 통해 데이터를 공유 할 수 있습니다. 물론 C와 C ++를 혼합 할 때 다른 경고가 있지만 이것은 간단한 예입니다.


2
가장 적합한 답변. C 호환성은 실제로 가장 중요한 이유입니다. 기본 액세스와 같은 다른 모든 것은 난해합니다.
Valentin Heinitz

16

모든 사람이 말했듯이, 유일한 차이점은 기본 액세스입니다. 그러나 도우미 메서드를 구현하더라도 간단한 데이터 클래스로 캡슐화를 원하지 않는 경우 특히 구조체를 사용합니다. 예를 들어, 다음과 같은 것이 필요할 때 :

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};

1
당신이 "구조를 빼앗아 간 것 같지 않은"일부 멤버 함수를 가진 구조체의 예를 들어 +1.
einpoklum

9

이미 언급했듯이 C ++에서 액세스 권한은 유일한 차이점입니다.

데이터 저장에만 구조체를 사용하는 경향이 있습니다. 데이터 작업이 더 쉬워지면 몇 가지 도우미 기능을 사용할 수 있습니다. 그러나 데이터에 흐름 제어 (예 : 내부 상태를 유지 또는 보호하는 게터 / 세터)가 필요하거나 주요 기능 (기본적으로 더 많은 객체와 같은)을 얻기 시작하면 즉시 의사 소통을 향상시키기 위해 클래스로 '업그레이드'됩니다.


9

Structs ( 보다 일반적으로 POD )는 언어 경계와 링커 형식간에 이식 가능하므로 C ++ 구현으로 C 호환 인터페이스를 제공 할 때 편리합니다.

그것이 당신에게 관심이 없다면, "class"대신에 "struct"를 사용하는 것이 의도의 좋은 전달 자라고 생각합니다 (@ZeroSignal이 위에서 말했듯이). Structs에는 예측 가능한 복사 의미가 있으므로 외부 미디어에 쓰거나 유선으로 전송할 데이터에 유용합니다.

Structs는 또한 의존적 인 typedef를 노출시키는 특성 템플릿과 같은 다양한 메타 프로그래밍 작업에 편리합니다.

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

... 그러나 그것은 실제로 구조체의 기본 보호 수준을 공개적으로 활용하는 것입니다 ...


1
POD의 올바른 사용법이 아닙니다. 구조체 (또는 클래스)는 POD 멤버 만 포함하는 경우 POD 구조체가 될 수 있습니다.
Martin York

4
"예측 가능한 복사 시맨틱": 시맨틱은 클래스와 동일하며 동일한 문제점이 있습니다 (얕은 사본).
Martin York

2
이 게시물은 모든 구조체가 포드라고 생각합니다 (우연히 우연히). 이것은 사실이 아닙니다. 나는 사람들이 이것으로 오도되지 않기를 바랍니다.
Michael Dorst

8

C ++의 경우 구조체와 클래스 사이에는 큰 차이가 없습니다. 주요 기능상의 차이점은 구조체의 멤버는 기본적으로 공개적이지만 클래스에서는 기본적으로 비공개입니다. 그렇지 않으면 언어와 관련하여 언어가 동일합니다.

즉, Brian이 말한 것과 비슷한 C # 에서처럼 C ++에서 구조체를 사용하는 경향이 있습니다. Structs는 간단한 데이터 컨테이너 인 반면 클래스는 데이터를 유지하는 것 외에도 데이터에 대해 작업해야하는 객체에 사용됩니다.


4

그들은 거의 같은 것입니다. C ++의 마법 덕분에 구조체는 클래스와 마찬가지로 함수를 보유하고 상속을 사용하며 "new"등을 사용하여 생성 할 수 있습니다.

유일한 기능적 차이점은 클래스는 개인 액세스 권한으로 시작하고 구조체는 공개로 시작한다는 것입니다. 이것은 C와의 하위 호환성 유지입니다.

실제로 필자는 항상 구조체를 데이터 홀더로 사용하고 클래스를 객체로 사용했습니다.


4

다른 사람들이 지적했듯이

  • 둘 다 기본 가시성과는 동일합니다.
  • 어떤 이유로 든 하나를 사용해야하는 이유가있을 수 있습니다

Stroustrup / Sutter의 사용시기에 대한 명확한 권장 사항이 있습니다.

클래스에 불변이있는 경우 클래스를 사용하십시오. 데이터 멤버가 독립적으로 다를 수있는 경우 구조체를 사용하십시오.

그러나 sth를 선언하는 것이 현명하지 않다는 것을 명심하십시오. 클래스 ( class X;)로 정의하고 struct ( struct X { ... }) 로 정의하십시오 . 일부 링커 (예 : g ++)에서 작동하고 다른 링커 (예 : MSVC)에서 실패 할 수 있으므로 개발자 지옥에서 자신을 찾을 수 있습니다.


이 링커 문제를 설명 할 수 있습니까?
궤도에서 가벼운 레이스

@LightnessRacesinOrbit 불행히도, 난 못해. 나는 예를 만들 수조차 없습니다. 사소한 class Foo; struct Foo { void bar() {} }; int main() { Foo().bar(); }것은 MSVC 2017을 컴파일하고 실행할 뿐 아니라 Foo로 선언 struct되었지만로 정의 된 명확한 경고를 생성합니다 class. 그러나 나는 또한 어리석은 버그를 찾기 위해 우리 팀이 반나절을 소비했다는 것을 분명히 기억합니다. 그때 우리가 어떤 MSVC 버전을 사용했는지 잘 모르겠습니다.
pasbi

링커는 사용자가 선언 을 사용했는지 또는 전달 선언을 알지 못하고 표준에 따라 두 가지를 자유롭게 상호 교환 할 수 있습니다. 여기서 냄새가 나지 않습니다. ODR 위반 버그가 아닙니까? classstruct
궤도에서 가벼움 레이스


나는 정확히 기억하지 못한다. 응용 프로그램에서 직접 발생하는 것이 아니라 gtest에 사용 된 라이브러리에서 문제가 발생했습니다. 나는 링커가 이해할 수없는 오류 (LNK ???)를 생성했다는 것을 알고 있습니다. 나는 대체 일단 struct에 -forwards class-forwards을, 문제는 멀리 갔다. 오늘 현재도 이상하다고 생각합니다. 당신이 그것에 빛을 비출 수 있다면 기쁠 것입니다.
pasbi

3

수업.

클래스 멤버는 기본적으로 비공개입니다.

class test_one {
    int main_one();
};

에 해당

class test_one {
  private:
    int main_one();
};

당신이 시도하면

int two = one.main_one();

main_one is private액세스 할 수 없기 때문에 오류가 발생 합니다. 공개를 지정하여 초기화하면 해결할 수 있습니다.

class test_one {
  public:
    int main_one();
};

구조.

구조체는 기본적으로 멤버가 공개되는 클래스입니다.

struct test_one {
    int main_one;
};

수단 main_one은 비공개입니다. 즉

class test_one {
  public:
    int main_one;
};

멤버가 어떤 가치를 가질 수있는 데이터 구조에 구조체를 사용하면 더 쉽습니다.


3

struct오버 의 장점은 class"첫 번째 공개 멤버, 그 다음 개인"을 고수하는 경우 한 줄의 코드를 저장한다는 것입니다. 이런 관점에서 나는 키워드가 class쓸모 없다는 것을 알게 되었다.

다음은 only structand never 를 사용하는 또 다른 이유입니다 class. C ++에 대한 일부 코드 스타일 지침은 함수 매크로에 작은 문자를 사용하는 것이 좋습니다. 그 이유는 매크로가 인라인 함수로 변환 될 때 이름을 변경할 필요가 없다는 것입니다. 여기도 마찬가지입니다. 멋진 C 스타일 구조체가 있고 언젠가 생성자 또는 편리한 메소드를 추가해야한다는 것을 알게되었습니다. 로 변경 class하시겠습니까? 어디에나?

structs와 classes를 구별하는 것은 너무 번거로워서 우리가해야 할 일을 프로그래밍하는 방식으로 들어가는 것입니다. 많은 C ++의 문제와 마찬가지로, 하위 호환성에 대한 강한 열망에서 비롯됩니다.


왜 그것을로 변경해야 class합니까? struct키워드로 정의 된 클래스 는 멤버 함수 나 생성자를 가질 수 없다고 생각 했습니까 ?
궤도에서 가벼움 경주

1. 일관성 및 2. 일부 정적 분석기로 인해 @LightnessRacesinOrbit가 1의 위반에 대해 불평합니다.
Vorac

그것은 따르지 않습니다. 다른 어떤 "일관성"을 고수하고 있습니까? 멤버가있는 모든 클래스는 키워드 joe()로 정의해야 class합니까? int멤버가 4 명 이상인 모든 클래스는 struct키워드 로 정의해야 합니까?
궤도에서 가벼움 경주

@LightnessRacesinOrbit 관용구 "POD 집계는으로 정의 struct되고 메소드가있는 집계는 class" 로 정의됩니다 . 너무 번거 로움.
Vorac

2

그것들은 다른 기본값 (으로 기본적으로 개인 class과 기본적으로으로 공공) 이 같은 것과 동일 struct하므로 이론적으로 완전히 상호 교환 가능합니다.

따라서 이동하기 위해 일부 정보를 패키징하려는 경우 몇 가지 방법을 사용하더라도 구조체를 사용합니다. 주된 용도가 메서드를 통해 이루어지고 주로 데이터 멤버가 아닌 불투명 한 경우 전체 클래스를 사용합니다.


2

구조체는 기본적으로 공개 액세스 권한을 가지며 클래스는 기본적으로 개인 액세스 권한을 갖습니다.

개인적으로 나는 데이터 전송 객체 또는 값 객체로 구조체를 사용합니다. 이와 같이 사용하면 다른 코드에 의한 수정을 방지하기 위해 모든 멤버를 const로 선언합니다.


2

모두 structclass생각 가시성과 같은 다른 기본값으로 후드 동일하며, struct기본은 공개와 class기본값은 비공개입니다. 당신은 적절한 사용과 다른 될 중 하나를 변경할 수 있습니다 privatepublic. 상속, 메소드, 생성자, 소멸자 및 객체 지향 언어의 모든 장점을 허용합니다.

그러나 둘 사이의 큰 차이점은 struct키워드가 C에서 지원되는 반면 키워드는 C에서 지원 class되지 않는다는 것입니다. 하나는를 사용할 수있는이 수단 struct으로는 될 수있는 파일이 포함 #include너무 오래 같이 중 C ++ 또는 C로 struct일반 C의 스타일 struct과에서 다른 모든 파일 즉 어떤 C ++와 같은 특정 키워드, C와 호환 포함 private, public아니오를 메소드, 상속 없음 등

AC 스타일 struct은 C 스타일 struct을 사용하여 인터페이스를 통해 데이터를주고받는 것을 지원하는 다른 인터페이스와 함께 사용할 수 있습니다 .

AC 스타일 struct은 메모리 영역의 레이아웃을 설명하는 일종의 템플릿 (C ++ 템플릿이 아니라 패턴 또는 스텐실)입니다. 지난 몇 년 동안 C와 C 플러그인 (여기서는 Java, Python 및 Visual Basic)에서 사용할 수있는 인터페이스가 C 스타일과 호환되는 인터페이스 중 일부가 만들어졌습니다 struct.


1

기술적으로 C ++에서는 모두 동일합니다. 예를 들어 구조체에 연산자가 오버로드 될 수 있습니다.

그러나 :

나는 여러 유형의 정보를 동시에 전달하고 싶을 때 구조체를 사용한다. 나는 "기능적"객체를 다룰 때 클래스를 사용한다.

도움이 되길 바랍니다.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

예를 들어, 여기 get ... () 메소드에서 구조체 학생을 반환하고 있습니다-즐기십시오.


1

struct를 언제 사용하고 언제 C ++에서 클래스를 사용하기로 하시겠습니까?

내가 사용하는 struct내가 정의 할 때 functorsPOD. 그렇지 않으면을 사용 class합니다.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};

1
이 대답은 연령의 징후를 보여줍니다 :) std::binary_function<>는 더 이상 사용되지 않으며 c ++ 17도 제거합니다.
sehe

15 년 전에 정의 된 언어 인 C ++ 03 시대에 작성된 이래로 놀라운 것은 아닙니다.
궤도에서 가벼움 경주

1

POD 유형이나 functor를 만들어야 할 때 구조체를 사용합니다.


1

모든 클래스 멤버는 기본적으로 비공개이며 모든 구조체 멤버는 기본적으로 공개입니다. 클래스에는 기본 프라이빗베이스가 있고 Struct에는 기본 퍼블릭베이스가 있습니다. C의 경우 Struct는 멤버 함수를 가질 수 없으며 C ++의 경우 구조체에 멤버 함수를 추가 할 수 있습니다. 이러한 차이점 외에는 놀라운 점이 없습니다.


0

멤버 데이터와 관련된 멤버 함수가없는 일부 데이터를 보유하고 데이터 변수에 직접 액세스 해야하는 경우에만 구조체를 사용합니다.

예 : 파일 및 소켓 스트림에서 데이터 읽기 / 쓰기 등. 함수 인수가 너무 많고 함수 구문이 너무 길어 보이는 구조에서 함수 인수를 전달하는 경우.

기술적으로 기본 접근성을 제외하고 클래스와 구조에는 큰 차이가 없습니다. 그 이상은 프로그래밍 방식에 따라 다릅니다.


-4

Structs는 다중 데이터 유형의 정보 배열과 같은 데이터 구조로 설계되었으며 클래스는 코드 패키징 (서브 루틴 및 함수의 모음과 같은)을 위해 고안되었습니다.

:(


-6

C ++에서는 "struct"를 사용하지 않습니다.

고의적으로 혼동하지 않는 한 개인 멤버를 원할 때 구조체를 사용하는 시나리오를 상상할 수 없습니다.

구조체를 사용하는 것이 데이터가 어떻게 사용되는지에 대한 구문상의 표시 인 것 같지만 클래스를 만들고 클래스 이름이나 주석을 통해 명시 적으로 만들려고합니다.

예 :

class PublicInputData {
    //data members
 };

나에 따르면, "데이터가 어떻게 사용되는지에 대한 구문 표시"는 구조체를 사용하는 완벽한 이유이며, 특히 대안이 클래스 이름에 주석이나 이름을 사용하는 경우입니다.
Viktor Sehr 2016 년

2
struct클래스의 멤버가 기본적으로 공개 될 것이라고 이미 명시 적으로 선언하지 않습니까?
wrongusername
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.