C ++에서 구조체와 클래스의 차이점은 무엇입니까?


441

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

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

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

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

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


6
링크 는 차이점을 잘 요약합니다.
sjsam

1
왜 사람들은 모두 struct를 사용하여 나무를 만들까요? 차이가 그렇게 많지 않은 것 같습니다. BTW, 그것은 훌륭한 웹 사이트입니다. @ sjsam
JW.ZG

1
structC와 C ++ 의 차이점을 찾고 계십니까? 여기를 참조하십시오 .
Marc.2377

@ JW.ZG "모두"가 아닌 사람들! 그렇게하는 사람들은 단순히 structC ++에서 의미 하는 것을 선호하거나 깨닫지 못합니다 . ;) 그러나 class키워드를 대신 사용할 수있는 이유는 없습니다 .
궤도에서 가벼움 경주

답변:


466

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

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

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

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

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

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


22
그것은 실제로 두 번째 차이가 아닙니다. 질문에 차이가 불완전하게 언급 된 것입니다. 를 사용하는 경우 기본적으로 모든 하위 오브젝트는 개인용이며 class, public은 기본적으로 사용 struct하며 둘 다 클래스 유형을 정의합니다.
Ben Voigt

10
당신이 요점을 놓쳤다 고 생각합니다, 벤 구조체를 위해 공개되고 클래스를 위해 비공개로 상속됩니다. 이는 매우 중요한 차이점이며 실제 회원 액세스와는 전혀 관련이 없습니다. 예를 들어, 언어가 다르게 정의했을 수 있습니다. 예를 들어 둘 다 기본적으로 공개적으로 상속되므로 매우 다른 의미를 갖습니다.
Assaf Lavie

104
사실, 실제 까다로운 차이 structclass후자가 대신에 사용될 수 있다는 것이다 typename템플릿 매개 변수를 선언하기 이전 수 있지만 없음. :)
sbi

21
@ MrUniverse : 이것은 완전히 잘못되었습니다. (컨벤션에 이것을 사용하는 학교가 있지만 구문 적으로 시행되지는 않습니다.)
sbi

3
@sbi는 "구조체와 클래스 사이의 진짜 까다로운 차이"- 귀여운,하지만 질문의 차이에 관한 구조체와 하지 키워드를 사용할 수있는 위치의 차이에 대한 클래스.
Jim Balter 2016 년

161

C ++ FAQ 인용 ,

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

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

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

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


123

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

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

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

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

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

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

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


클래스와 구조가 근본적으로 달라지기보다 클래스와 구조가 동일하게 작동하는 것이 더 쉽다는 점도 주목할 가치가 있습니다. 예를 들어 구조체로 선언 된 모든 항목이 PODS 여야한다는 점 (예 : 가상 멤버, 사소한 기본 생성자 또는 소멸자 등을 사용하지 않는 구조체)을 지정하는 것으로 되돌아 보면 약간의 이점이 있었지만 그러한 것은 내 지식에는 해당되지 않았습니다. C ++ 표준이나 구현에 필요했습니다.
supercat

1
@supercat OO 언어가 아닌 언어로 작성된 프로그램의 방대한 레퍼토리가 유효한 프로그램이었던 OO 언어라는 사실은 개념을 전면에 가져 왔으며 더 순수한 OO 언어보다 더 많이 등장하는 것으로 보입니다. (물론 실제로 표준에 정의되어 있습니다). 초기 C ++의 역사는 분명히 그것에 대해 많은 것을 설명합니다. Stroustrup의 "C ++의 디자인과 진화"는 흥미로운 내용입니다.
존 한나

1
나는해야한다 "OOP 틱"없는 그 모든 것을 느끼는 사람 사이의 종교 전쟁을 인식하고, 그 OOP를 생각하는 사람들은으로 간주되어야한다 도구가 아니라 도구를. C ++은 확실히 후자의 철학을 포용하는 것처럼 보이지만 실제로는 언어에 대해 잘 모릅니다. 내 자신의 철학은 객체를 원할 때 객체를 사용해야하며 관련이 있지만 독립적 인 변수의 집계를 원할 때 그것을 사용해야한다는 것입니다. C ++은 이런 종류의 것들 사이에 구문상의 차이를 만들지 않으며, .NET은 그 차이를 흐리게하려고 노력하지만, 내가 아는 것은 거의 없습니다.
supercat

1
... C ++ 또는 .NET보다 인식하는 것이 좋습니다. 변수 집계가 정확히 OOPish는 아니지만 유용 할 때 사용해서는 안된다는 의미는 아닙니다 .
supercat

3
"C에는 구조체가 있고 캡슐화의 개념이 없으므로 모든 것이 공개됩니다."라는 의견에 동의하지 않습니다. -File struct내부의 정의를 숨기고 *.c다른 번역 단위가 포인터로만 사용할 수 있습니다. 따라서 다른 번역 단위는 내부의 내용을 알지 못하므로 캡슐화가 더욱 강력 해 struct집니다.
12431234123412341234123

32

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


15
회원뿐만 아니라 상속을 포함한 모든 액세스.
Nemanja Trifunovic

4
글쎄, 다른 차이점은 의미론이라고 말하고 싶습니다. 많은 사람들 구조체 그들이 C.에서 남은로 "데이터 구조"를 생각하게한다
크리스 Kumler

3
@KrisKumler : 그것들은 "의미론"이 아닙니다. 그들은 개인적인 감정입니다. 모두 structclass선언 클래스 (정의 본체 해석 와이즈 해석에도 불구하고) 동일한 의미로한다.
궤도에서 가벼움 레이스

28

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

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

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


32
무슨 차이? 설명 해주십시오.
crashmstr 2016 년

10

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

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

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

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

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


1
이것은 구조체와 클래스에 대한 가장 명백한 것입니다. "스트럭처는 데이터에 관한 것이고 클래스는 코드에 관한 것이다"는 "구조는 데이터에 관한 것이고, 클래스는 데이터에 대한 보안, 조작에 관한 것"
Arun Aravind

3
C ++에서는 구조체를 만들 수 없습니다. 상속 된 struct키워드를 사용해서 만 클래스를 만들 수 있습니다 .
궤도에서 가벼움 경주

1
이 답변은 C ++에 관한 것이 아닙니다. C ++에서 struct(포함 클래스 선언 public/ private/ protected, 상속 등).
melpomene

구조체는 어떻게 추상적입니까? 원시 구조체를 파일에 쓰는 것은 C에서도 문제가 있습니다 (일반적인 문제에는 패딩, 엔디안, 다른 단어 크기 등이 포함됩니다). SIZE당신이 말하는 이 매크로 는 무엇입니까 ?
melpomene

10

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;
}

전문가가 언급 한 코드 예제 3-7을 제거했습니다.
Suraj K Thomas

8

다른 차이점은 클래스와 구조체의 기본 상속이라는 것인데, 당연히 개인과 공용입니다.


5
  1. 구조체의 멤버는 기본적으로 public이고 클래스의 멤버는 기본적으로 private입니다.
  2. 다른 구조 또는 클래스의 구조에 대한 기본 상속은 public입니다. 다른 구조 또는 클래스의 구조에 대한 기본 상속은 private입니다.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

이것은 VS2005에 있습니다.


_tmain표준 C ++이 아닙니다.
melpomene

4

사양에 없습니다. 주요 차이점은 2 년 안에 코드를 읽을 때 프로그래머가 기대하는 것입니다. 구조체는 종종 POD로 간주됩니다. Structs는 객체를 정의하는 것 이외의 목적으로 유형을 정의 할 때 템플릿 메타 프로그래밍에도 사용됩니다.


4

클래스를 사용하도록 구성된 레거시 앱을 업데이트 한 경우 다음과 같은 문제가 발생할 수 있습니다.

오래된 코드에는 구조체가 있고 코드가 정리되었으며 클래스로 변경되었습니다. 가상 함수 또는 두 개가 새로운 업데이트 된 클래스에 추가되었습니다.

가상 함수가 클래스에있는 경우 내부적으로 컴파일러는 함수를 가리 키기 위해 클래스 데이터에 대한 추가 포인터를 추가합니다.

이것이 이전 레거시 코드를 어기는 방법은 이전 코드 어딘가에서 memfill을 사용하여 구조체를 지워서 모두 0으로 지우면 여분의 포인터 데이터가 스톰됩니다.


1
구조체를 정리하기 위해 memfill을 사용하는 코드에는 다른 공격 습관이있을 수 있습니다. 조심해
David Thornley

@DavidThornley : 지울 제로 필의 사용 또는 데이터 구조가 혼합 언어 프로젝트에서 C에서 표준 초기화는, 사람은 C 부분의 코드가 피할 기대할 수 없습니다 calloc찬성 new. 코드의 C 부분에서 사용되는 모든 구조가 실제로 PODS인지 확인하는 것이 가능합니다.
supercat

4
  1. 키워드 class로 정의 된 클래스의 멤버는 private기본적으로입니다. 키워드 struct(또는 union)로 정의 된 클래스의 멤버는 public기본적으로입니다.

  2. 기본 클래스에 대한 액세스 지정자의 유무에 public때 가정 유도 클래스를 선언 struct하고 private, 클래스가 선언 될 때 추정된다 class.

  3. 을 선언 할 수 enum class있지만을 ( 를) 선언 할 수는 없습니다 enum struct.

  4. 사용할 수는 template<class T>있지만 사용할 수는 없습니다 template<struct T>.

또한 C ++ 표준을 사용하면 형식을로 선언 한 다음 형식을 선언 할 때 struct사용할 수 class있으며 그 반대도 가능합니다. 또한, std::is_class<Y>::valuetrueY는 것에 대한 struct및를 class되지만 false대한 enum class.


좋은 대답, 비록 명백한 명백한 0이 누락되었지만 c ++ structclassc ++의 차이는 데이터 유형 (또는 더 나은 대안)이 아닌 키워드 간의 차이입니다.
idclev 463035818

@ formerlyknownas_463035818 : 그러나 당신 std::is_class<Y>::value은 그것을 커버한다고 생각하지 않습니까?
Bathsheba

그렇습니다. 그것은 일반적인 오해이며, 나머지는 단지 추론에 불과하기 때문에 더 두드러 질 것이라고 생각했습니다.
idclev 463035818

그대로 신경 끄시 고, 당신의 대답은 완벽, 내가 하나가 다른 하나 나던 상처를 썼다
idclev 463,035,818

4

차이 classstruct키워드 사이가 아닌 데이터 유형 사이의 차이입니다. 이 둘

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

둘 다 클래스 유형을 정의합니다. 이 문맥에서 키워드의 차이점은 다른 기본 액세스입니다.

  • foo::x공개적이고 foo_base공개적으로 상속
  • bar::x사적이며 bar_base사적으로 상속


2

컨벤션 일뿐입니다. 간단한 데이터를 보유하기 위해 Structs를 만들 수 있지만 나중에 멤버 함수와 생성자를 추가하여 시간을 발전시킵니다. 반면에 공개 이외의 다른 것을 보는 것은 드문 일입니다.


2

ISO IEC 14882-2003

9 개 강의

§삼

구조는 class-key로 정의 된 클래스입니다struct . 멤버와 기본 클래스 (10 항)는 기본적으로 공개되어 있습니다 (11 항).


2

템플릿과 관련하여 또 다른 주요 차이점이 있습니다. 내가 아는 한 템플릿을 정의 할 때 클래스는 사용할 수 있지만 구조체는 사용할 수 없습니다.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here

1
구조를 일반화 된 유형으로 사용할 수 없다는 것을 강조하려는 경우 잘못된 것입니다. 그리고 struct규칙에 의해서만 허용되지 않습니다 (더 나은 class의미로 여기에서 다른 의미로 사용되는 키워드는 템플릿 매개 변수에 'class'또는 'typename'사용 참조 ).
dma_k 2013

키워드는 허용되지 않지만 정의한 클래스 만 통과하면됩니다 struct. 간단히 해보십시오. struct T{}; template <typename T> void foo() {} foo<T>();
궤도에서 가벼움 경주

1

다른 답변은 개인 / 공용 기본값을 언급했지만 (구조체는 클래스입니다. 두 가지 다른 항목이 아니라 동일한 항목을 정의하는 두 가지 방법입니다).

주목해야 할 것은 (특히 관리자가 "관리되지 않는"C ++를 언급하기 때문에 MSVC ++를 사용하고있을 가능성이 있기 때문에) 클래스가 선언 class되고 정의 된 경우 struct(또는 다른 방법으로 ) Visual C ++가 특정 상황에서 불평한다는 것입니다. ), 표준에 따르면 완벽하게 합법적입니다.


나는 그것이 매우 늦은 의견이라는 것을 알고 있지만, Windows ABI가 구조체와 클래스를 다르게 mangles 때문에 클래스와 구조체의 혼합 (전달) 선언이 실제로 연결 문제를 이해하기 어렵게 만들 수 있기 때문에 위에서 언급 한 경고가 가치가 없다는 것을 알고 있어야합니다!
MFH

1
  • . 클래스에서는 기본적으로 모든 멤버가 비공개이지만 구조적 멤버는 기본적으로 공개입니다.

    1. 구조체의 생성자 및 소멸자와 같은 용어는 없지만 클래스 컴파일러의 경우 제공하지 않으면 기본값이 생성됩니다.

    2. 빈 클래스의 크기는 1 바이트이므로 빈 구조의 크기는 0 바이트입니다. struct 기본 액세스 유형은 공용입니다. 구조체는 일반적으로 데이터를 그룹화하는 데 사용해야합니다.

    클래스 기본 액세스 유형은 개인이며 상속의 기본 모드는 개인입니다. 클래스는 데이터와 해당 데이터에서 작동하는 메서드를 그룹화하는 데 사용해야합니다.

    간단히 말해, 규칙은 데이터를 그룹화하는 목적으로 struct를 사용하고 데이터 추상화 및 상속이 필요할 때 클래스를 사용하는 것입니다.

    C ++ 구조에서 클래스와 클래스는 명시 적으로 역 참조되지 않는 한 값으로 전달됩니다. 다른 언어에서 클래스와 구조는 별개의 의미를 가질 수 있습니다. 객체 (클래스의 인스턴스)는 참조로 전달되고 구조는 값으로 전달 될 수 있습니다. 참고 :이 질문과 관련된 의견이 있습니다. 대화에 추가하려면 토론 페이지를 참조하십시오.


3
"2. 빈 클래스의 Sizeof 빈 클래스는 1 바이트이므로 빈 구조의 Sizeof 0 바이트입니다." 그릇된. 방금 테스트했습니다 g++. Empty Base Optimization을 생각할 수도 있지만 둘 다에 적용됩니다.
cdunn2001

1
사실이 아니다. C ++에서 빈 구조체의 크기는 1입니다. C에서 빈 구조체는 허용되지 않습니다. GCC는 C에서 컴파일러 확장으로 빈 구조체를 허용하며 이러한 구조체의 크기는 0입니다.
Johan Råde

이 답변은 잘못되었습니다. 크기가 큰 것 외에도 생성자 / 소멸자 부분도 정확하지 않습니다. 구조체는 생성자와 소멸자를 잘 가질 수 있습니다. 실제로 structC ++에서 본격적인 클래스를 만듭니다.
melpomene

1

다른 답변에 암시되어 있지만 명시 적으로 언급되지 않았습니다. 구조는 사용법에 따라 C 호환 가능합니다. 수업은 없습니다.

이것은 C 호환되고 싶은 헤더를 작성하는 경우 struct 이외의 옵션은 없습니다 (C 세계에서는 함수를 가질 수 없지만 함수 포인터를 가질 수 있음).


-1

https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx struct 또는 class로 갈시기에 대한 지침으로이를 고려할 수 있습니다 .

√ 유형의 인스턴스가 작고 일반적으로 수명이 짧거나 다른 객체에 일반적으로 포함되는 경우 클래스 대신 구조체를 정의하십시오.

유형에 다음 특성이 모두없는 한 구조체를 정의하지 않아야합니다.

기본 유형 (int, double 등)과 유사한 단일 값을 논리적으로 나타냅니다.

인스턴스 크기는 16 바이트 미만입니다.

불변입니다.

자주 박스에 넣을 필요는 없습니다.


C ++이 아니라 .NET / C #에 관한 것입니다.
melpomene

-2

수업은 소프트웨어 엔지니어링의 맥락에서만 의미가 있습니다. 데이터 구조와 알고리즘의 맥락에서 클래스와 구조체는 다르지 않습니다. 클래스 멤버를 참조해야하는 규칙은 없습니다.

클래스가없는 수많은 사람들과 함께 대규모 프로젝트를 개발할 때, 모든 사람들이 원하는 기능과 데이터를 사용하기 때문에 복잡한 결합 코드를 얻게됩니다. 클래스는 디커플링 및 재사용 코드를 향상시키기 위해 권한 제어 및 고유 기능을 제공합니다.

일부 소프트웨어 엔지니어링 원칙을 읽으면 수업 없이는 대부분의 표준을 쉽게 구현할 수 없습니다. 예를 들면 다음과 같습니다. http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

BTW, 구조체가 메모리의 크런치를 할당하고 여러 변수를 포함하는 경우 값 형식 변수는 구조체가 할당 된 위치에 값이 포함되어 있음을 나타냅니다. 대조적으로, 참조 형 변수의 값은 외부 적이며 포인터가 참조를 가지며 참조는 구조체가 할당 된 곳에 포함됩니다.


이 답변은 C ++에 관한 것이 아닙니다. C ++에서 struct클래스 (권한 제어, 상속 등 포함)를 선언합니다.
melpomene

-3

C ++에서 structclass 키워드 의 차이점은 특정 복합 데이터 유형에 특정 지정자가없는 경우 기본적으로 struct 또는 union 은 데이터 숨기기를 고려하는 공용 키워드이지만 class는 프로그램 숨기기를 고려하는 개인 키워드라는 점입니다. 코드 또는 데이터. 항상 일부 프로그래머 는 코드 목적으로 데이터와 클래스구조체 를 사용 합니다. 자세한 내용은 다른 소스에 문의하십시오.


OP는 이미 struct기본적으로 멤버가 공개라고 언급했으며 2009 년에 수락 된 답변은 상속을 언급합니다. 4 년 후에 새로운 정보를 추가하지 않는 다른 대답을 쓰는 이유는 무엇입니까?
melpomene

-3

이러한 모든 요소 중에서 개념 클래스가 "구조"가 아닌 실제 개체를 표현하는 데 매우 적합하다고 결론을 내릴 수 있습니다. 클래스에 사용되는 OOP 개념이 실제 시나리오를 설명하는 데 매우 실용적이기 때문에 실제 시나리오를 쉽게 병합 할 수 있습니다. 예를 들어, 기본 상속은 구조체에 대해 공개이지만 실제 세계 에이 규칙을 적용하면 어리 석습니다. 그러나 클래스 기본 상속에서는 비공개이며 더 현실적입니다.

어쨌든, 내가 정당화 해야하는 것은 클래스가 훨씬 넓고 실제 적용 가능한 개념이지만 구조는 내부 조직이 열악한 기본 개념입니다 (이벤트는 OOP 개념을 따르지만 의미는 좋지 않습니다)


1
사유 상속은 어떻게 "보다 현실적"입니까? 대부분의 프로그래밍 언어에는 개인 상속이라는 개념조차 없습니다.
melpomene

-3

oops의 구조 키워드와 클래스 키워드의 주요 차이점은 구조에 공개 및 개인 멤버 선언이 없으며 데이터 멤버 및 멤버 함수를 보호, 공개, 비공개로 정의 할 수 있다는 것입니다.


이 답변은 C ++에 관한 것이 아닙니다. C ++에서 struct(포함 클래스 선언 public/ private/ protected, 상속 등).
melpomene

-3

** 업데이트 : **이 회신을 무시하십시오. 구조체의 경우 값이 초기화되지 않았지만 0이 될 가능성을 고려하지 않았습니다. 구조체와 클래스 사이에는 초기화 차이가 없습니다.


기본 초기화와 관련된 구조체와 클래스 사이에 또 ​​다른 차이점이 있습니다.

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

해당 코드를 실행하고 myTester를 검사하십시오. m_Foo의 경우 m_Foo.a 구조체가 0으로 초기화되었지만 m_Bar의 경우 m_Bar.a 클래스는 초기화되지 않았습니다. 따라서 구조체와 클래스의 기본 생성자가 수행하는 작업에는 차이가있는 것으로 보입니다. Visual Studio에서 이것을보고 있습니다.


1
m_Foo.a초기화 되었는지 어떻게 알았 습니까? 초기화되지 않고 방금 발생한 경우 0어떻게됩니까?
melpomene

아니 내 잘못이야. 이것은 구조체와 클래스의 차이가 아닙니다. 초기화 특성은 동일합니다.
Eric Hill

-4

구조체와 클래스의 주요 차이점은 구조체에서는 다른 데이터 형식의 데이터 변수 만 선언 할 수 있고 클래스에서는 데이터 변수, 멤버 함수를 선언 할 수 있으므로 함수를 통해 데이터 변수를 조작 할 수 있다는 것입니다.

-> class vs struct에서 찾을 수있는 또 다른 편리한 점은 프로그램에서 파일을 구현하는 동안 매번 새로운 작업 세트마다 구조체의 작업을 반복하고 싶다면 별도의 기능을 수행해야하며 struct 객체를 파일에서 읽은 후 전달하여 일부 작업을 수행하십시오. 클래스에서 매번 필요한 데이터에 대해 일부 작업을 수행하는 함수를 만드는 경우 .. 파일에서 객체를 읽고 함수를 호출하면됩니다.

그러나 프로그래머가 자신에게 적합한 방법을 결정합니다 ... 나에 따르면 OOP를 지원하기 때문에 항상 수업을 선호하므로 거의 모든 언어로 구현되는 이유와 모든 시간 프로그래밍의 훌륭한 기능입니다. )

그리고 내가 잊어 버린 가장 잊혀진 차이점은 클래스가 데이터 숨기기를 지원하고 구조체가하지 않는 동안 내장 데이터 형식에서 수행되는 작업을 지원한다는 것입니다!


1
C ++에서 struct멤버 함수를 가질 수 있음
chtz

@chtz 감사합니다 ... 나는 지금이 기능에 대해 알고있어 .. 정말 고마워요 .. 초보자만큼이나 초보자가 아니기 때문에 미래에도 u 사람들의 조언이 필요합니다 :-)
Yug Rawal

실제로 멤버 함수 는 더 넓은 의미로 사용되어야합니다. struct생성자, 멤버 함수 및 소멸자 (가상, 개인, 보호 또는 공용)를 가질 수 있습니다. 그들은 상속받을 수 있습니다. 실제로 .. 수업이 가질 수있는 모든 것. 간단한 규칙은 C에서 구조체로 선언 한 것을 struct로 선언하고 개인 및 보호 변수, 가상 함수, ctor 및 dtor 등을 선언하는 경우 클래스로 선언하는 것입니다. 그러나 그것은 언어에 의해 시행되지 않는 단지 협약 일뿐입니다.
지안 파올로

-5

다른 차이점을 발견했습니다. 클래스에서 생성자를 정의하지 않으면 컴파일러에서 생성자를 정의합니다. 그러나 구조체에서 생성자를 정의하지 않으면 컴파일러에서도 생성자를 정의하지 않습니다. 따라서 실제로 생성자가 필요하지 않은 경우에는 struct가 더 나은 선택입니다 (성능 팁). 내 영어 실력이 미안해


4
사실이 아닙니다. 이와 관련 struct하여 class키워드로 정의 된 클래스와 키워드로 정의 된 클래스 사이에는 차이가 없습니다 .
ymett

생성자가없는 구조체를 사용하면 생성자가없는 클래스보다 속도가 빠릅니다.
Ali


-5

클래스는 참조 유형이고 구조는 값 유형입니다.
클래스가 참조 유형이라고 말하면
기본적으로 인스턴스 변수의 주소가 포함됩니다.

예를 들면 다음과 같습니다.

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

메인 메소드
에서이 클래스에 대한 메모리를 할당하고 해당 클래스
의 기본 주소를 MyClass 유형 변수 (_myClassObject2)에 저장하는 새로운 연산자를 사용 하여이 클래스의 인스턴스를 만들 수 있습니다 .

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

위 프로그램에서 MyClass _myClassObject2 = _myClassObject1; 명령은 MyClass 유형의 두 변수가

  1. myClassObject1
  2. myClassObject2

동일한 메모리 위치를 가리 킵니다.
기본적으로 동일한 메모리 위치를 동일한 유형의 다른 변수에 할당합니다.

따라서 MyClass 객체 유형 중 하나에서 변경 한 내용이
모두 동일한 메모리 위치를 가리 키기 때문에 다른 유형에 영향을 미칩니다 .

"_myClassObject1.DataMember = 10;" 이 줄에서 두 개체의 데이터 멤버는 모두 10의 값을 포함합니다.
"_myClassObject2.DataMember = 20;" 이 줄에서 객체의 데이터 멤버는 모두 20의 값을 포함합니다.
결국 우리는 포인터를 통해 객체의 데이터 멤버 에 액세스합니다.

클래스와 달리 구조는 값 유형입니다. 예를 들면 다음과 같습니다.

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

위 프로그램에서
new 연산자를 사용하여 MyStructure 유형의 객체를 인스턴스화하고 MyStructure 유형의
_myStructObject 변수에 주소를 저장하고
"_myStructObject1.DataMember = 10"을 사용하여 구조의 데이터 멤버에 값 10을 할당합니다.

다음 줄에서는
MyStructure 유형의 다른 변수 _myStructObject2를 선언하고 _myStructObject1을 할당합니다.
여기서 .NET C # 컴파일러는 _myStructureObject1 개체의 다른 복사본을 만들고
해당 메모리 위치를 MyStructure 변수 _myStructObject2에 할당합니다.

따라서 _myStructObject1에서 변경 한 내용이 MyStructrue 유형의 다른 변수 _myStructObject2에 영향을 미치지 않습니다.
그렇기 때문에 우리는 구조가 가치 유형이라고 말합니다.

따라서 클래스의 직접적인 Base 클래스는 Object이고 Structure의 직접적인 Base 클래스는 Object에서 상속되는 ValueType입니다.
클래스는 상속을 지원하지만 구조는 지원하지 않습니다.

우리는 어떻게 말합니까?
그리고 그 이유는 무엇입니까?
답은 수업입니다.

추상적, 봉인, 정적 및 부분적 일 수 있으며 개인, 보호 및 보호 내부 일 수 없습니다.


4
나는 이것이 C #에 대한 질문에 대답하려고한다고 생각합니까? 문제는 C ++에 관한 것이며,이 답변이 정확하지 않습니까?
smw

@smw는 C #으로 샘플 코드를 작성했으며 C ++ struct과 사이에 매개 변수 전달에 차이가 없는지 확인하기 위해 여기에 왔습니다 class. 여기에 아무도 언급하지 않았으며 웹 전체도 언급하지 않았습니다. 따라서 이것이 C ++에도 적용되지 않는다고 생각합니다.
John

이것은 유효한 C # 코드조차도 아닙니다. 키워드가 모두 잘못되었습니다. "Public", "Static", "Int"및 "Class"는 대문자로 사용해서는 안되며 "Structure"가 아닌 "struct"여야합니다. 설명은 C #을위한 대부분 정확하다 (하지만 구조체 수 여전히 상속 인터페이스, 그냥 다른 구조체)하지만 C에 대해 이후 질문에 대답하지 않습니다 ++ ...
대럴 호프만

2
이 답변은 완전 말도 안됩니다. 코드 예제에는 Visual Basic과 C #의 이상한 조합이 사용되며 전체 "클래스는 참조 유형이고 구조는 값 유형"입니다. C ++이 아닌 .NET (예 : C #)에만 적용됩니다. 당신은 잘못된 방에 있습니다, 친구. 이곳은 당신이 속한 곳 : stackoverflow.com/questions/13049
TheFlash

그러나이 답변 은 구조체가 값 유형과 같이 사용된다는 C (++)에 대해서도 동일하다는 것을 나타냅니다. int a = 3; int b = a;MyStruct a=MyStruct("data"); MyStruct b = a;
luckydonald

-8

구조와 클래스에는 3 가지 기본 차이점이 있습니다.

스택 메모리의 클래스가 참조 용으로 만 예약되고 실제 메모리가 힙 메모리에 예약되어 있는지 여부에 관계없이 스택 메모리의 구조 (프로그래밍 언어에 가까운)에 메모리가 예약됩니다.

2Nd-기본적으로 구조는 클래스가 개인으로 취급되는지 여부를 공개적으로 취급합니다.

3Rd- 구조에서 코드를 재사용 할 수는 없지만 클래스에서는 상속이라고하는 많은 시간에 동일한 코드를 재사용 할 수 있습니다.


2
C ++ 구조는 상속 및 추상 메소드를 지원합니다. 구조와 클래스는 같은 방식으로 할당됩니다. "새"로 인스턴스화되지 않은 경우에도 힙에 클래스를 할당하는 것은 임베디드 시스템에 적합하지 않습니다.
JCMS

2
# 1도 잘못되었습니다. 스택은 해당 유형의 것을 로컬 변수로 선언 할 때 사용되며 힙은 "new"연산자를 사용할 때 사용됩니다.
Score_Under
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.