C ++에서 언제 클래스와 구조체를 사용해야합니까?
어떤 시나리오 에서 C ++에서 a struct
vs a 를 사용하는 것이 더 낫 class
습니까?
C ++에서 a class
와 a의 차이점은 struct
구조체에는 기본 public
멤버와베이스가 있고 클래스에는 기본 private
멤버와베이스가 있다는 것입니다. 클래스와 구조체 모두 public
, protected
및 private
멤버를 혼합하여 사용할 수 있으며 상속을 사용할 수 있으며 멤버 함수를 가질 수 있습니다.
클래스와 같은 기능이없는 일반 오래된 데이터 구조로 구조체를 사용하고 private
데이터 및 멤버 함수가있는 집계 데이터 구조로 클래스를 사용하는 것이 좋습니다 .
다른 모든 사람들이 지적했듯이 실제 언어 차이는 두 가지뿐입니다.
struct
기본값은 공용 액세스이고class
기본값은 개인 액세스입니다.- 상속 할 때
struct
기본값은public
상속이고class
기본값은private
상속입니다. (역설적으로 C ++의 많은 것들과 마찬가지로 기본값은 역방향입니다.public
상속은 훨씬 더 일반적인 선택이지만 사람들struct
은 "public
"키워드 를 입력하는 것을 절약하기 위해 s를 선언하는 경우는 거의 없습니다 .
그러나 실제로 진짜 차이는 사이에 class
/ struct
하지 않는 생성자 / 소멸자를 선언 한. 클래스 구성을 인수하면 더 이상 적용되지 않는 "일반-오래된 데이터"POD 유형에 대한 확실한 보증이 있습니다. 이 구분을 명확하게하기 위해 많은 사람들은 의도적으로 struct
POD 유형에 s 만 사용 하고, 메서드를 추가하려는 경우 class
es를 사용 합니다. 아래 두 조각의 차이점은 그렇지 않으면 의미가 없습니다.
class X
{
public:
// ...
};
struct X
{
// ...
};
(실제로 "POD 유형"이 무엇을 의미하는지에 대한 좋은 설명이있는 스레드가 있습니다. C ++에서 POD 유형은 무엇입니까? )
기존 답변에는 많은 오해가 있습니다.
예, 클래스를 선언하는 데 사용한 키워드에 따라 클래스 정의 내에서 키워드를 수정하는 액세스를 다시 정렬해야 할 수 있습니다.
그러나 구문을 넘어서 하나를 선택 하는 유일한 이유는 규칙 / 스타일 / 선호입니다.
어떤 사람들은 struct
멤버 함수가없는 클래스에 대한 키워드 를 고수하는 것을 좋아합니다. 그 결과 정의가 C의 단순한 구조와 "같이 보이기"때문입니다.
유사하게, 어떤 사람들은 class
멤버 함수와 private
데이터가있는 클래스에 키워드 를 사용하는 것을 좋아합니다. 그 키워드에 "class"라고 표시되어 있고 따라서 객체 지향 프로그래밍에 대한 가장 좋아하는 책의 예제처럼 보이기 때문입니다.
현실은 이것이 전적으로 여러분과 여러분의 팀에 달려 있으며, 여러분의 프로그램에 문자 그대로 아무런 차이도 만들지 않을 것입니다.
다음 두 클래스는 이름을 제외한 모든면에서 절대적으로 동일합니다.
struct Foo
{
int x;
};
class Bar
{
public:
int x;
};
재 선언 할 때 키워드를 전환 할 수도 있습니다.
class Foo;
struct Bar;
( 이로 인해 부적합으로 인해 Visual Studio 빌드가 중단 되기는하지만 이렇게하면 컴파일러가 경고를 내 보냅니다.)
다음 표현식은 모두 참으로 평가됩니다.
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 ++ 인 라이브러리를 작성하는 경우 C ++에서 "struct"를 사용할 수 있지만 API는 C 또는 C ++ 코드로 호출 할 수 있습니다. 다음과 같이 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
Then you can write a function bar() in a C++ file using C++ code and make it callable from C and the two worlds can share data through the declared struct's. There are other caveats of course when mixing C and C++ but this is a simplified example.
As every one says, the only real difference is the default access. But I particularly use struct when I don't want any sort of encapsulation with a simple data class, even if I implement some helper methods. For instance, when I need something like this:
struct myvec {
int x;
int y;
int z;
int length() {return x+y+z;}
};
Structs (PODs, more generally) are handy when you're providing a C-compatible interface with a C++ implementation, since they're portable across language borders and linker formats.
If that's not a concern to you, then I suppose the use of the "struct" instead of "class" is a good communicator of intent (as @ZeroSignal said above). Structs also have more predictable copying semantics, so they're useful for data you intend to write to external media or send across the wire.
Structs are also handy for various metaprogramming tasks, like traits templates that just expose a bunch of dependent typedefs:
template <typename T> struct type_traits {
typedef T type;
typedef T::iterator_type iterator_type;
...
};
...But that's really just taking advantage of struct's default protection level being public...
For C++, there really isn't much of a difference between structs and classes. The main functional difference is that members of a struct are public by default, while they are private by default in classes. Otherwise, as far as the language is concerned, they are equivalent.
That said, I tend to use structs in C++ like I do in C#, similar to what Brian has said. Structs are simple data containers, while classes are used for objects that need to act on the data in addition to just holding on to it.
To answer my own question (shamelessly), As already mentioned, access privileges are the only difference between them in C++.
I tend to use a struct for data-storage only. I'll allow it to get a few helper functions if it makes working with the data easier. However as soon as the data requires flow control (i.e. getters/setters that maintain or protect an internal state) or starts acquring any major functionality (basically more object-like), it will get 'upgraded' to a class to better communicate intent.
They are pretty much the same thing. Thanks to the magic of C++, a struct can hold functions, use inheritance, created using "new" and so on just like a class
The only functional difference is that a class begins with private access rights, while a struct begins with public. This is the maintain backwards compatibility with C.
In practice, I've always used structs as data holders and classes as objects.
Class.
Class members are private by default.
class test_one {
int main_one();
};
Is equivalent to
class test_one {
private:
int main_one();
};
So if you try
int two = one.main_one();
We will get an error: main_one is private
because its not accessible. We can solve it by initializing it by specifying its a public ie
class test_one {
public:
int main_one();
};
Struct.
A struct is a class where members are public by default.
struct test_one {
int main_one;
};
Means main_one
is private ie
class test_one {
public:
int main_one;
};
I use structs for data structures where the members can take any value, it's easier that way.
they're the same thing with different defaults (private by default for class
, and public by default for struct
), so in theory they're totally interchangeable.
so, if I just want to package some info to move around, I use a struct, even if i put a few methods there (but not many). If it's a mostly-opaque thing, where the main use would be via methods, and not directly to the data members, i use a full class.
Structs by default have public access and classes by default have private access.
Personally I use structs for Data Transfer Objects or as Value Objects. When used as such I declare all members as const to prevent modification by other code.
An advantage of struct
over class
is that it save one line of code, if adhering to "first public members, then private". In this light, I find the keyword class
useless.
Here is another reason for using only struct
and never class
. Some code style guidelines for C++ suggest using small letters for function macros, the rationale being that when the macro is converted to an inline function, the name shouldn't need to be changed. Same here. You have your nice C-style struct and one day, you find out you need to add a constructor, or some convenience method. Do you change it to a class
? Everywhere?
Distinguishing between struct
s and class
es is just too much hassle, getting into the way of doing what we should be doing - programming. Like so many of C++'s problems, it arises out of the strong desire for backwards compatability.
As others have pointed out
- both are equivalent apart from default visibility
- there may be reasons to be forced to use the one or the other for whatever reason
There's a clear recommendation about when to use which from Stroustrup/Sutter:
Use class if the class has an invariant; use struct if the data members can vary independently
However, keep in mind that it is not wise to forward declare sth. as a class (class X;
) and define it as struct (struct X { ... }
). It may work on some linkers (e.g., g++) and may fail on others (e.g., MSVC), so you will find yourself in developer hell.
Technically both are the same in C++ - for instance it's possible for a struct to have overloaded operators etc.
However :
I use structs when I wish to pass information of multiple types simultaneously I use classes when the I'm dealing with a "functional" object.
Hope it helps.
#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;
};
For instance, I'm returning a struct student in the get...() methods over here - enjoy.
When would you choose to use struct and when to use class in C++?
I use struct
when I define functors
and POD
. Otherwise I use 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; }
};
I use structs when I need to create POD type or functor.
All class members are private by default and all struct members are public by default. Class has default private bases and Struct has default public bases. Struct in case of C cannot have member functions where as in case of C++ we can have member functions being added to the struct. Other than these differences, I don't find anything surprising about them.
I use struct only when I need to hold some data without any member functions associated to it (to operate on the member data) and to access the data variables directly.
Eg: Reading/Writing data from files and socket streams etc. Passing function arguments in a structure where the function arguments are too many and function syntax looks too lengthy.
Technically there is no big difference between class and struture except default accessibility. More over it depends on programming style how you use it.
I thought that Structs was intended as a Data Structure (like a multi-data type array of information) and classes was inteded for Code Packaging (like collections of subroutines & functions)..
:(
I never use "struct" in C++.
I can't ever imagine a scenario where you would use a struct when you want private members, unless you're willfully trying to be confusing.
It seems that using structs is more of a syntactic indication of how the data will be used, but I'd rather just make a class and try to make that explicit in the name of the class, or through comments.
E.g.
class PublicInputData {
//data members
};
참고URL : https://stackoverflow.com/questions/54585/when-should-you-use-a-class-vs-a-struct-in-c
'development' 카테고리의 다른 글
XML 문서에서 이스케이프하려면 어떤 문자가 필요합니까? (0) | 2020.09.28 |
---|---|
Bash에서 문자열을 비교하는 방법 (0) | 2020.09.28 |
파이썬에서 상수를 어떻게 생성합니까? (0) | 2020.09.28 |
Objective-C의 typedef 열거 형은 무엇입니까? (0) | 2020.09.27 |
div에서 텍스트를 세로로 정렬하려면 어떻게합니까? (0) | 2020.09.27 |