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

时间:2020-03-05 18:50:52  来源:igfitidea点击:

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

解决方案

回答

C ++中的"类"和"结构"之间的区别在于,结构具有默认的"公共"成员和基数,而类具有默认的"私有"成员和基数。类和结构体可以混合使用public成员,protected成员和private成员,可以使用继承并且可以具有成员函数。

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

回答

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

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

回答

他们几乎是同一回事。得益于C ++的魔力,结构可以像类一样保存函数,使用继承,使用" new"创建等等。

唯一的功能差异是,类从私有访问权限开始,而结构从公共访问权限开始。这是保持与C的向后兼容性。

实际上,我一直将结构用作数据持有人,将类用作对象。

回答

当我的系统正在从另一系统接收固定格式的消息(例如,串行端口)时,该结构对我有所帮助。我们可以将字节流转换为定义字段的结构,然后轻松访问这些字段。

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 ++实现的C兼容接口时,结构(POD,更一般而言)会很方便,因为它们可以跨语言边界和链接器格式移植。

如果我们不必担心,那么我认为使用" struct"而不是" class"可以很好地传达意图(如@ZeroSignal所述)。结构还具有更可预测的复制语义,因此它们对于我们打算写入外部媒体或者通过网络发送的数据很有用。

结构对于各种元编程任务也很方便,例如仅公开一堆依赖的typedef的特征模板:

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

...但是这实际上只是利用了struct的默认保护级别是公开的...

回答

我从不在C ++中使用"结构"。

我无法想像一个场景,当我们想要私有成员时会使用struct,除非我们故意要造成混淆。

似乎使用structs更像是如何使用数据的语法指示,但我宁愿仅创建一个类并尝试以类的名称或者通过注释将其明确。

例如。

class PublicInputData {
    //data members
 };

回答

我唯一一次使用结构而不是类的方法是在函数调用中使用函子之前声明函子,并且为了清楚起见,希望最小化语法。例如。:

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

回答

它们是相同的东西,具有不同的默认值(默认情况下," class"默认为private,而" struct"默认为public),因此从理论上讲它们是完全可以互换的。

因此,即使我只想打包一些信息来移动,我也会使用一个结构,即使我在其中放置了一些方法(但不是很多)。如果是最不透明的东西,主要用途是通过方法,而不是直接传递给数据成员,则使用完整类。

回答

默认情况下,结构具有公共访问权限,默认情况下,类具有私有访问权限。

我个人将结构用于数据传输对象或者用作值对象。当这样使用时,我将所有成员声明为const,以防止被其他代码修改。

回答

正如其他所有人所指出的,实际上只有两种实际语言差异:

  • " struct"默认为公共访问,而" class"默认为私有访问。
  • 继承时," struct"默认为" public"继承,而" class"默认为" private"继承。 (具有讽刺意味的是,与C ++中的许多事情一样,默认值是向后的:到目前为止," public"继承是更常见的选择,但是人们很少声明structs只是为了省去键入"public"关键字。

但是实际上,真正的区别在于声明了构造函数/析构函数的" class" /" struct"与未声明的。对于"普通数据" POD类型有某些保证,一旦我们接管了班级的建设,这些保证将不再适用。为了清楚地区分,许多人特意只对POD类型使用struct,并且,如果他们要添加任何方法,请使用classes。否则,以下两个片段之间的区别是没有意义的:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(顺便说一下,这是一个线程,其中对" POD类型"的实际含义作了一些很好的解释:C ++中的POD类型是什么?)

回答

从C ++ FAQ Lite:

The members and base classes of a struct are public by default, while in class, they default to private. Note: you should make your base classes explicitly public, private, or protected, rather than relying on the defaults.
  
  struct and class are otherwise functionally equivalent.
  
  OK, enough of that squeaky clean techno talk. Emotionally, most developers make a strong distinction between a class and a struct. A struct simply feels like an open pile of bits with very little in the way of encapsulation or functionality. A class feels like a living and responsible member of society with intelligent services, a strong encapsulation barrier, and a well defined interface. Since that's the connotation most people already have, you should probably use the struct keyword if you have a class that has very few methods and has public data (such things do exist in well designed systems!), but otherwise you should probably use the class keyword.

回答

我以为Structs是作为数据结构使用的(就像信息的多数据类型的数组一样),而类是为代码打包而设计的(例如子例程和函数的集合)。

:(

回答

仅当我需要保留一些没有任何关联成员函数的数据(对成员数据进行操作)并直接访问数据变量时,才使用struct。

例如:从文件和套接字流等读取/写入数据。在结构中传递函数参数,在该结构中,函数参数太多并且函数语法看起来太长。

从技术上讲,除了默认可访问性之外,类和结构之间没有太大区别。
除此之外,还取决于编程风格,以及如何使用它。

回答

从技术上讲,两者在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 ...()方法中返回一个struct学生。

回答

就像每个人都说的那样,唯一真正的区别是默认访问权限。但是,当我不希望使用简单的数据类进行任何封装时,即使我实现了一些辅助方法,我也特别使用struct。例如,当我需要这样的东西时:

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

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

回答

When would you choose to use struct
  and when to use class in C++?

当我定义functorsPOD时,我使用struct。否则我使用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; }
};

回答

如果要编写内部结构为C ++的库,则可以在C ++中使用"结构",但是API可以由C或者C ++代码调用。我们只需制作一个包含结构和全局API函数的标头,就可以像下面这样向C和C ++代码公开这些标头:

// 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 ++时,当然还有其他注意事项,但这是一个简化的示例。