C ++에서 구조체와 클래스의 차이점은 무엇입니까? 차이점을 배우고 싶습니다. OO

이 질문은 이미 C # /. Net의 맥락에서 요청되었습니다 .

이제 C ++에서 구조체와 클래스의 차이점을 배우고 싶습니다. OO 디자인에서 기술적 차이점과 하나를 선택해야하는 이유에 대해 논의하십시오.

나는 명백한 차이로 시작할 것이다.

  • 지정하지 않는 경우 public:private:, 구조체의 멤버는 기본적으로 공용; 클래스 멤버는 기본적으로 비공개입니다.

C ++ 사양의 모호한 부분에서 다른 차이점이있을 것이라고 확신합니다.



답변

클래스와 구조체의 까다로운 두 번째 차이점을 잊어 버립니다.

표준을 인용하십시오 (C ++ 98에서 C ++ 11의 11.2.2).

부재에 접근 지정자
파생 된 클래스가 선언되는 경우베이스 클래스, 공중 가정
구조체 및 개인이 클래스가 선언 될 때 가정 클래스 .

그리고 완전성을 위해 클래스와 구조체의 더 널리 알려진 차이점은 (11.2)에 정의되어 있습니다.

키워드 class 로 정의 된 클래스의 멤버는 기본적으로 비공개 입니다. 키워드 struct 또는 union
로 정의 된 클래스의 멤버는 기본적으로 public 입니다.

추가 차이점 : 키워드 class를 사용하여 템플릿 매개 변수를 선언 할 수 있지만 struct키워드를 사용할 수는 없습니다.


답변

C ++ FAQ 인용 ,

[7.8] 키워드 구조체와 클래스의 차이점은 무엇입니까?

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

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

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


답변

C ++의 기원과 C와의 호환성을 기억할 가치가 있습니다.

C에는 구조체가 있고 캡슐화 개념이 없으므로 모든 것이 공개됩니다.

기본적으로 객체 지향 접근 방식을 취할 때 기본적으로 공개하는 것은 나쁜 생각으로 간주되므로 기본적으로 OOP에 도움이되는 C 형식 (C에서 OO를 수행 할 수는 있지만 도움이되지는 않음)을 만드는 경우 C ++ (원래 “C With Classes”)의 아이디어는 기본적으로 멤버를 비공개로 만드는 것이 좋습니다.

반면, Stroustrup이 struct기본적으로 개인 을 유지 하기 위해 의미를 변경 한 경우 호환성이 떨어질 수 있습니다 (표준이 다를 때만 큼 자주 적용되지는 않지만 모든 유효한 C 프로그램도 유효한 C ++ 프로그램입니다. C ++에 발판을 마련하는 데 큰 영향을 미쳤습니다).

따라서 새로운 키워드 class는 구조체와 똑같지 만 기본적으로 비공개로 도입되었습니다.

C ++이 역사없이 처음부터 시작 되었다면, 아마도 하나의 키워드 만 가질 것입니다. 또한 영향을 미치지 않았을 것입니다.

일반적으로 사람들은 C에서 구조체가 사용되는 방식과 같은 일을 할 때 구조체를 사용하는 경향이 있습니다. 공용 멤버, 생성자 없음 (조합이 아닌 한 클래스와 마찬가지로 구조체에 생성자를 가질 있지만 사람들은하지 않는 경향이 있음), 가상 메서드 등이 없습니다. 사람들에게 기계를 가르치기 위해 코드를 읽는 사람들 (또는 우리는 어셈블리와 원시 VM opcode를 고수 할 것) 그것을 고수하는 것이 좋습니다.


답변

클래스 멤버는 기본적으로 비공개입니다. Struct의 멤버는 기본적으로 공개됩니다. 그 외에 다른 차이점은 없습니다. 이 질문 도 참조하십시오 .


답변

C ++ 프로그래밍 언어 의 Stroustrup에 따르면 :

사용하는 스타일은 상황과 취향에 따라 다릅니다. 나는 보통 struct모든 데이터를 공개하는 클래스 에 사용하는 것을 선호합니다 . 이러한 클래스는 “정확한 유형이 아니라 데이터 구조”라고 생각합니다.

기능적으로는 공공 / 개인 이외의 차이가 없습니다


답변

STRUCT는 구조 스펙에 따라 주어진 메모리 청크를 분할하는 추상 데이터 유형의 유형입니다. 구조는 종종 파일에 그대로 쓸 수 있으므로 구조는 파일 직렬화 / 역 직렬화에 특히 유용합니다. (즉, 구조체에 대한 포인터를 가져 와서 SIZE 매크로를 사용하여 복사 할 바이트 수를 계산 한 다음 구조체 안팎으로 데이터를 이동하십시오.)

클래스는 정보 숨기기를 보장하는 다른 유형의 추상 데이터 유형입니다. 내부적으로 다양한 가공, 방법, 온도 변수, 상태 변수가있을 수 있습니다. 클래스를 사용하려는 모든 코드에 일관된 API를 제공하는 데 사용됩니다.

실제로 구조체는 데이터에 관한 것이고 클래스는 코드에 관한 것입니다.

그러나 이들은 단지 추상화 일 뿐이라는 것을 이해해야합니다. 클래스처럼 보이는 구조체와 구조체처럼 보이는 구조체를 만드는 것은 완벽하게 가능합니다. 실제로 초기 C ++ 컴파일러는 C ++ 코드를 C로 변환하는 프리 컴파일러 일뿐입니다. 따라서 이러한 추상화는 컴퓨터 자체의 자산이 아니라 논리적 사고에 도움이됩니다.

클래스는 각각 다른 유형의 추상화라는 사실 외에도 C 코드 명명 퍼즐에 대한 솔루션을 제공합니다. 같은 이름으로 둘 이상의 함수를 노출시킬 수 없으므로 개발자는 _ () 패턴을 따르 곤했습니다. 예 : mathlibextreme_max (). API를 클래스로 그룹화하면 유사한 함수 (여기서는 “메소드”라고 함)를 함께 그룹화하고 다른 클래스의 메소드 이름 지정으로부터 보호 할 수 있습니다. 이를 통해 프로그래머는 코드를보다 잘 구성하고 코드 재사용을 높일 수 있습니다. 이론 상으로는 적어도.


답변

1) 클래스 멤버는 기본적으로 비공개이며 struct 멤버는 기본적으로 공개입니다.

예를 들어 프로그램 1은 컴파일에 실패하고 프로그램 2는 정상적으로 작동합니다.

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

2) 클래스 / 구조체에서 구조체를 파생시킬 때 기본 클래스 / 구조체의 기본 액세스 지정자는 public입니다. 클래스를 파생시킬 때 기본 액세스 지정자는 개인용입니다.

예를 들어 프로그램 3은 컴파일에 실패하고 프로그램 4는 정상적으로 작동합니다.

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}