提问



在什么情况下在C ++中使用struct vs class会更好?

最佳参考


C ++中classstruct之间的差异是结构具有默认public成员,而基础和类具有默认private成员和基础。类和结构都可以混合使用publicprotectedprivate成员,可以使用继承并且可以具有成员函数。


我建议使用结构作为普通旧数据结构而不使用任何类似于类的特性,并使用类作为具有private数据和成员函数的聚合数据结构。

其它参考1


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



  • struct默认为公共访问,class默认为私人访问。

  • 继承时,struct默认为public继承,class默认为private继承。 (具有讽刺意味的是,与C ++中的许多东西一样,默认是倒退的:public继承是目前比较常见的选择,但人们很少声明struct只是为了节省输入public]]关键字。



但实践中的真正区别在于声明构造函数/析构函数的class/struct和不具有普通旧数据POD类型的某些保证。一旦你接管了班级的建设,就不再申请了。为了清楚地区分这种区别,许多人故意仅将struct用于POD类型,如果他们要添加任何方法,请使用class es。下面两个片段之间的区别是没有意义的:


class X
{
  public:

  // ...
};

struct X
{
  // ...
};


(顺便提一下,这里有一个关于POD类型实际含义的一些很好的解释:C ++中的POD类型是什么?)

其它参考2


现有答案中存在许多误解。


classstruct都声明了一个类。


是的,您可能必须在类定义中重新排列访问修改关键字,具体取决于您用于声明类的关键字。


但是,除了语法之外,仅选择其中一个的原因是约定/样式/首选项。


有些人喜欢在没有成员函数的情况下坚持使用struct关键字,因为结果定义看起来像来自C的简单结构。


类似地,有些人喜欢将class关键字用于具有成员函数和private数据的类,因为它上面写着类,因此看起来就像他们最喜欢的面向对象编程的书中的例子。


现实情况是,这完全取决于您和您的团队,并且它将使您的计划完全没有任何区别。


除了名称之外,以下两个类在各方面都是完全相同的:


struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};


您甚至可以在重新声明时切换关键字:


class Foo;
struct Bar;


(虽然有些编译器会在你这样做的时候发出警告,假设你可能没有想要做某些令人困惑的事情,因此应该提示你仔细检查你的代码。


并且以下表达式都评估为true:


std::is_class<Foo>::value
std::is_class<Bar>::value


但请注意,当重新定义时,您无法切换关键字;这仅仅是因为(根据单一定义规则)翻译单元的重复类定义必须包含相同的令牌序列。这意味着你甚至不能用int const member;交换const int member;,而与classstruct的语义无关。

其它参考3


我唯一一次使用struct而不是类是在函数调用中使用它之前声明一个仿函数,并且为了清晰起见,希望最小化语法。例如。:


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

其它参考4


来自C ++ FAQ Lite:[69]



  结构的成员和基类默认是公共的,而在类中,它们默认为私有。注意:您应该明确公开,私有或保护基类,而不是依赖于默认值。

  
  struct和class在功能上是等价的。

  
  好的,足够的那个干净的技术谈话。在情感上,大多数开发人员在类和结构之间做出了很强的区分。结构只是感觉像一堆开放的位,几乎没有封装或功能。课程感觉像是一个生活和负责任的社会成员,拥有智能服务,强大的封装屏障和明确的界面。既然这是大多数人已经拥有的内涵,那么你应该使用struct关键字,如果你的类只有很少的方法且有公共数据(这些东西确实存在于设计良好的系统中!),否则你应该使用class关键字。


其它参考5


结构对我有用的一个地方是当我有一个系统从另一个系统接收固定格式的消息(比如说,一个串口)。你可以将字节流转换为定义你的字段的结构,然后轻松访问字段。


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中所做的一样,但我发现必须将消息解码为类的开销通常是不值得的。

其它参考6


如果要编写内部为C ++但可以通过C或C ++代码调用API的库,则可以在C ++中使用struct。您只需创建一个包含结构和全局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调用,两个世界可以通过声明的struct来共享数据。当然,在混合使用C和C ++时还有其他注意事项,但这是一个简化的例子。

其它参考7


当您通过C ++实现提供C兼容接口时,结构(更一般地说是POD)很方便,因为它们可以跨语言边界和链接器格式移植。[70]


如果那不是你的问题,那么我认为使用struct而不是class是一个良好的意向沟通者(正如@ZeroSignal所说)。结构也有更可预测的复制语义,所以他们对您打算写入外部媒体或通过线路发送的数据非常有用。


结构对于各种元编程任务也很方便,比如只显示一堆依赖typedef的traits模板:


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


......但这真的只是利用了结构的默认保护级别是公开的......

其它参考8


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


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

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

其它参考9


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


也就是说,我倾向于像在C#中一样使用C ++中的结构,类似于Brian所说的。结构是简单的数据容器,而类用于需要对数据执行操作的对象,而不仅仅是保持数据。

其它参考10


回答我自己的问题(无耻地),如前所述,访问权限是C ++中它们之间的唯一区别。


我倾向于仅使用结构进行数据存储。我将允许它获得一些辅助函数,如果它使数据更容易处理。但是一旦数据需要流控制(即维护或保护内部状态的getter/setter)或开始获取任何主要功能(基本上更像对象),它将被升级到类以更好地传达意图。

其它参考11


它们几乎是一回事。感谢C ++的神奇之处,结构可以保存函数,使用继承,使用new创建,就像类一样


唯一的功能区别是类以私有访问权限开头,而结构以public开头。这是与C保持向后兼容性。


在实践中,我总是使用结构作为数据持有者和类作为对象。

其它参考12


它们与不同的默认值相同(默认为class私有,默认为struct),所以理论上它们完全可以互换。


所以,如果我只想打包一些信息来移动,我使用一个结构,即使我在那里放了几个方法(但不是很多)。如果它是一个大多数不透明的东西,主要用途是通过方法,而不是直接对数据成员,我使用完整的类。

其它参考13


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


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

其它参考14


类。



默认情况下,类成员是私有的。


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


我将结构用于数据结构,其中成员可以获取任何值,它是
这样更容易。

其它参考15


从技术上讲,两者在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 ...()方法返回结构学生 - 享受。

其它参考16



  你什么时候选择使用struct
  什么时候在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; }
};

其它参考17


当我需要创建POD类型或仿函数时,我使用结构。

其它参考18


struct优于class的一个优点是,如果遵守第一个公共成员,那么私有,它可以节省一行代码。有鉴于此,我发现关键字class毫无用处。


这是仅使用struct而从不class的另一个原因。 C ++的一些代码风格指南建议对函数宏使用小写字母,其基本原理是当宏转换为内联函数时,名称不应该被更改。这里相同。你有一个很好的C风格结构和有一天,你发现你需要添加一个构造函数,或者一些方便的方法。你把它改成class吗?到处都是?


区分structclass之间的麻烦太麻烦了,我们正在做我们应该做的事情 - 编程。像许多C ++的问题一样,它源于对向后兼容性的强烈渴望。

其它参考19


我只在需要保存一些数据而没有任何与之关联的成员函数(对成员数据进行操作)并直接访问数据变量时才使用struct。


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


从技术上讲,除了默认可访问性之外,类和结构之间没有很大的区别。
更多内容取决于编程风格如何使用它。

其它参考20


我认为Structs用作数据结构(如多数据类型的信息数组),并且类用于代码打包(如子程序和函数的集合)。


:(

其它参考21


我从不在C ++中使用struct。


我不能想象一个场景,当你想要私人成员时你会使用一个结构,除非你故意试图让人困惑。


似乎使用结构更多地是关于如何使用数据的语法指示,但我宁愿只创建一个类并尝试在类的名称中或通过注释进行显式化。


例如。


class PublicInputData {
    //data members
 };

其它参考22


访问函数不是结构和类之间的唯一区别。对于POD(普通旧数据)类型,结构更好,因为它更易于管理编译器和程序员。对于不使用面向对象编程的初学者,使用结构很好。