什么时候应该在 C ++ 中使用类与结构?

在哪种情况下,在 C ++ 中使用struct比使用class更好?

答案

C ++ 中的classstruct之间的区别在于,结构具有默认的public成员和基数,而类具有默认的private成员和基数。类和结构都可以包含public成员, protected成员和private成员,可以使用继承并可以具有成员函数。

我建议将结构用作没有任何类功能的纯旧数据结构,并建议将类用作具有private数据和成员函数的聚合数据结构。

class X
{
  public:

  // ...
};

struct X
{
  // ...
};
struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};
class Foo;
struct Bar;
std::is_class<Foo>::value
std::is_class<Bar>::value
struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare());

C ++ FAQ Lite

默认情况下,结构的成员和基类是公共的,而在类中,它们的缺省是私有的。注意:您应该将基类显式设置为公共,私有或受保护,而不要依赖默认值。

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 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
struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};
template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

对于 C ++,结构和类之间确实没有太大区别。主要的功能差异在于,结构的成员默认情况下是公共的,而它们在类中默认情况下是私有的。否则,就语言而言,它们是等效的。

也就是说,我倾向于像在 C#中一样在 C ++ 中使用结构,这与 Brian 所说的相似。结构是简单的数据容器,而类用于除要保留数据之外还需要对数据进行操作的对象。