문제

어떤 시나리오에서 structclass C++에서?

도움이 되었습니까?

해결책

차이점 class 그리고 struct C++에서는 구조체에 기본값이 있습니다. public 멤버, 베이스, 클래스에는 기본값이 있습니다. private 회원 및 기지.클래스와 구조체 모두 다음을 혼합할 수 있습니다. public, protected 그리고 private 멤버는 상속을 사용할 수 있고 멤버 기능을 가질 수 있습니다.

클래스와 유사한 기능 없이 구조체를 일반 데이터 구조로 사용하고 클래스를 집계 데이터 구조로 사용하는 것이 좋습니다. private 데이터와 멤버 함수.

다른 팁

다른 사람들이 지적했듯이 실제 언어 차이는 두 가지뿐입니다.

  • struct 기본적으로 공개 액세스로 설정되어 있으며 class 기본값은 비공개 액세스입니다.
  • 상속받을 때, struct 기본값은 public 상속과 class 기본값은 private 계승.(아이러니하게도 C++의 많은 기능과 마찬가지로 기본값은 거꾸로입니다. public 상속은 훨씬 더 일반적인 선택이지만 사람들은 상속을 선언하는 경우가 거의 없습니다. struct"를 입력하는 시간을 절약하기 위한 것입니다.public" 키워드.

그러나 실제로 실제 차이점은 class/struct 생성자/소멸자를 선언하는 것과 그렇지 않은 것을 선언하는 것입니다.클래스 구성을 인계받은 후에는 더 이상 적용되지 않는 "일반 오래된 데이터" POD 유형에 대한 특정 보장이 있습니다.이러한 구별을 명확하게 유지하기 위해 많은 사람들은 의도적으로 structPOD 유형의 경우 s를 사용하고 메소드를 추가하려는 경우 다음을 사용하십시오. class예.아래 두 조각의 차이점은 그렇지 않으면 의미가 없습니다.

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(덧붙여, "POD 유형"이 실제로 무엇을 의미하는지에 대한 좋은 설명이 포함된 스레드는 다음과 같습니다. C++의 POD 유형은 무엇입니까?)

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

둘 다 class 그리고 struct 클래스를 선언합니다.

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

그러나 구문을 넘어서, 오직 다른 것보다 하나를 선택하는 이유는 관습/스타일/선호도입니다.

어떤 사람들은 계속 유지하는 것을 좋아합니다. 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.

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

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

로부터 C++ FAQ 라이트:

구조체의 멤버와 기본 클래스는 기본적으로 공개이지만 클래스에서는 기본적으로 비공개입니다.메모:기본값에 의존하기보다는 기본 클래스를 명시적으로 공개, 비공개 또는 보호로 설정해야 합니다.

struct와 class는 기능적으로 동일합니다.

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

구조체가 나에게 도움이 되었던 한 가지 경우는 다른 시스템으로부터 고정 형식 메시지(예를 들어 직렬 포트를 통해)를 수신하는 시스템이 있을 때입니다.필드를 정의하는 구조체로 바이트 스트림을 캐스팅한 다음 필드에 쉽게 액세스할 수 있습니다.

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++이지만 API가 C 또는 C++ 코드로 호출될 수 있는 라이브러리를 작성하는 경우 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++를 혼합할 때 다른 주의 사항이 있지만 이는 단순화된 예입니다.

모두가 말했듯이 유일한 실제 차이점은 기본 액세스입니다.그러나 일부 도우미 메서드를 구현하더라도 간단한 데이터 클래스로 어떤 종류의 캡슐화도 원하지 않을 때 특히 struct를 사용합니다.예를 들어, 다음과 같은 것이 필요할 때:

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

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

구조체(POD, 더 일반적으로)는 언어 경계와 링커 형식을 넘어 이식 가능하므로 C++ 구현과 함께 C 호환 인터페이스를 제공할 때 편리합니다.

그것이 당신에게 문제가 되지 않는다면, "클래스" 대신 "구조체"를 사용하는 것이 의도를 잘 전달하는 것이라고 생각합니다(@ZeroSignal이 위에서 말했듯이).또한 구조체는 더 예측 가능한 복사 의미를 가지므로 외부 미디어에 쓰거나 네트워크를 통해 전송하려는 데이터에 유용합니다.

구조체는 여러 종속 형식 정의를 노출하는 특성 템플릿과 같은 다양한 메타프로그래밍 작업에도 유용합니다.

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

...하지만 그것은 실제로 구조체의 기본 보호 수준이 공개라는 점을 활용하는 것입니다...

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

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

내 자신의 질문에 (뻔뻔스럽게) 대답하기 위해 이미 언급했듯이 액세스 권한은 C++에서의 유일한 차이점입니다.

나는 데이터 저장용으로만 구조체를 사용하는 경향이 있습니다.데이터 작업이 더 쉬워진다면 몇 가지 도우미 기능을 가져오도록 허용하겠습니다.그러나 데이터에 흐름 제어가 필요한 경우(예:내부 상태를 유지 또는 보호하는 getter/setter) 또는 주요 기능(기본적으로 객체와 유사)을 획득하기 시작하면 의도를 더 잘 전달하기 위해 클래스로 '업그레이드'됩니다.

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

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

실제로 저는 항상 구조체를 데이터 홀더로, 클래스를 객체로 사용해 왔습니다.

수업.

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

class test_one {
    int main_one();
};

다음과 같습니다.

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

그러니 시도해 보면

int two = one.main_one();

오류가 발생합니다. main_one is private 접근이 불가능하기 때문입니다.공개 IE를 지정하여 초기화하여 해결할 수 있습니다.

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

구조체.

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

struct test_one {
    int main_one;
};

수단 main_one 비공개입니다. 즉

class test_one {
  public:
    int main_one;
};

멤버가 값을 취할 수있는 데이터 구조에는 스트러크를 사용합니다. 그런 식으로 더 쉽습니다.

기본값은 다르지만 동일합니다(기본적으로 비공개입니다). class, 기본적으로 공개 struct), 이론적으로는 완전히 상호 교환이 가능합니다.

따라서 이동하기 위해 일부 정보를 패키징하려는 경우 거기에 몇 가지 메서드를 추가하더라도(많지는 않음) 구조체를 사용합니다.데이터 멤버를 직접 사용하지 않고 메서드를 통해 주로 사용하는 대부분 불투명한 경우 전체 클래스를 사용합니다.

기본적으로 구조체에는 공개 액세스 권한이 있고 클래스에는 기본적으로 비공개 액세스 권한이 있습니다.

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

장점 struct ~ 위에 class "첫 번째 공개 멤버, 그 다음 비공개"를 준수하면 한 줄의 코드가 절약된다는 것입니다.그런 점에서 나는 키워드를 찾는다. class 쓸모 없는.

only를 사용하는 또 다른 이유는 다음과 같습니다. struct 그리고 결코 class.C++에 대한 일부 코드 스타일 지침에서는 함수 매크로에 소문자 사용을 제안합니다. 그 이유는 매크로가 인라인 함수로 변환될 때 이름을 변경할 필요가 없다는 것입니다.여기도 마찬가지입니다.멋진 C 스타일 구조체가 있는데 어느 날 생성자나 편의 메서드를 추가해야 한다는 사실을 알게 되었습니다.로 바꾸시나요? class?어디에나?

구별하기 struct모래 classes는 우리가 해야 할 일, 즉 프로그래밍을 하는 데 방해가 되어 너무 번거롭습니다.C++의 많은 문제와 마찬가지로 이 문제도 이전 버전과의 호환성에 대한 강한 열망에서 발생합니다.

기술적으로 둘 다 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...() 메소드에서 구조체 Student를 반환하고 있습니다. 즐겨보세요.

구조물을 언제 사용하고 언제 C ++에서 클래스를 사용 하시겠습니까?

나는 사용한다 struct 내가 정의할 때 functors 그리고 POD.그렇지 않으면 나는 사용한다 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; }
};

POD 유형이나 펑터를 생성해야 할 때 구조체를 사용합니다.

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

다른 사람들이 지적했듯이

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

Stroustrup/Sutter에서 언제 사용해야 하는지에 대한 명확한 권장 사항이 있습니다.

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

그러나 sth를 앞으로 선언하는 것은 현명하지 않다는 점을 명심하십시오.수업으로 (class X;) 그리고 이를 구조체(struct X { ... }).일부 링커(예: g++)에서는 작동하고 다른 링커(예: MSVC)에서는 실패할 수 있으므로 개발자 지옥에 빠지게 됩니다.

나는 연관된 멤버 함수 없이 일부 데이터를 보유해야 하고(멤버 데이터에 대해 작동하기 위해) 데이터 변수에 직접 액세스해야 하는 경우에만 구조체를 사용합니다.

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

기술적으로 기본 접근성을 제외하면 클래스와 구조 사이에는 큰 차이가 없습니다.또한 사용 방법에 따라 프로그래밍 스타일이 달라집니다.

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

:(

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

의도적으로 혼란을 주려고 하지 않는 한 비공개 멤버를 원할 때 구조체를 사용하는 시나리오는 상상할 수 없습니다.

구조체를 사용하는 것은 데이터가 어떻게 사용될 것인지에 대한 구문적 표시에 더 가까운 것 같지만, 저는 그냥 클래스를 만들고 클래스 이름이나 주석을 통해 이를 명시적으로 만드는 편이 낫습니다.

예:

class PublicInputData {
    //data members
 };
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top