什么场景下使用比较好 struct 与一个 class 在 C++ 中?

有帮助吗?

解决方案

之间的差异 class 和一个 struct 在 C++ 中,结构体有默认值 public 成员、基类和类都有默认值 private 成员和基地。类和结构都可以混合使用 public, protectedprivate 成员,可以使用继承并且可以具有成员函数。

我建议使用结构作为普通的旧数据结构,没有任何类似类的功能,并使用类作为聚合数据结构 private 数据和成员函数。

其他提示

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

  • struct 默认为公共访问并且 class 默认为私人访问。
  • 继承的时候, struct 默认为 public 继承和 class 默认为 private 遗产。(讽刺的是,与 C++ 中的许多东西一样,默认值是向后的: public 继承是迄今为止更常见的选择,但人们很少声明 struct只是为了节省输入“public” 关键字。

但实践中真正的区别在于 class/struct 声明了一个构造函数/析构函数和一个没有声明的构造函数/析构函数。对于“普通旧数据”POD 类型有某些保证,一旦您接管了类的构造,这些保证就不再适用。为了保持这种区别清晰,许多人故意只使用 structs 用于 POD 类型,并且,如果他们要添加任何方法,请使用 classes.否则下面两个片段之间的差异是没有意义的:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(顺便说一句,这里有一个线程,其中对“POD 类型”的实际含义有一些很好的解释: C++ 中的 POD 类型是什么?)

现有的答案存在很多误解。

两个都 classstruct 声明一个类。

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

但是,除了语法之外, 仅有的 选择其中之一的原因是惯例/风格/偏好。

有些人喜欢坚持 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++ 常见问题精简版:

结构体的成员和基类默认是公共的,而在类中,它们默认是私有的。笔记:您应该将基类显式设置为公共、私有或受保护,而不是依赖默认值。

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 上面所说)。结构还具有更可预测的复制语义,因此它们对于您打算写入外部介质或通过网络发送的数据非常有用。

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

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

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

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

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

回答我自己的问题(无耻地),正如已经提到的,访问权限是它们在 C++ 中的唯一区别。

我倾向于仅使用结构来存储数据。如果它能让数据处理变得更容易,我将允许它获得一些辅助函数。然而,一旦数据需要流量控制(即维护或保护内部状态的 getters/setters)或开始获取任何主要功能(基本上更像对象),它将“升级”为一个类以更好地传达意图。

它们几乎是同一件事。感谢 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 无用。

这是仅使用的另一个原因 struct 永不 class. 。C++ 的一些代码风格指南建议对函数宏使用小写字母,理由是当宏转换为内联函数时,不需要更改名称。同样在这里。您拥有漂亮的 C 风格结构,有一天,您发现需要添加一个构造函数或一些便捷方法。你把它改成一个 class?到处?

区分 structclasses 太麻烦了,妨碍了我们做我们应该做的事情——编程。与 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...() 方法中返回一个 struct Student - 享受吧。

您什么时候选择使用struct以及何时在C ++中使用类?

我用 struct 当我定义 functorsPOD. 。否则我用 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 类型或函子时,我使用结构体。

默认情况下,所有类成员都是私有的,所有结构成员默认都是公共的。类具有默认的私有基,结构具有默认的公共基。C 的结构不能有成员函数,而 C++ 的结构可以将成员函数添加到结构中。除了这些差异之外,我没有发现它们有什么令人惊讶的地方。

正如其他人指出的那样

  • 除了默认可见性之外,两者都是等效的
  • 无论出于何种原因,可能都有理由被迫使用其中之一

Stroustrup/Sutter 对于何时使用哪个有明确的建议:

如果类具有不变量,则使用类;如果数据成员可以独立变化,则使用结构体

然而,请记住,转发声明某事是不明智的。作为一个类(class X;) 并将其定义为结构体 (struct X { ... })。它可能在某些链接器(例如,g++)上工作,但在其他链接器(例如,MSVC)上可能会失败,因此您会发现自己陷入了开发者地狱。

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

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

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

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

:(

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

我无法想象当您需要私有成员时您会使用结构的场景,除非您故意试图混淆。

似乎使用结构更多的是如何使用数据的语法指示,但我宁愿创建一个类并尝试在类名称中或通过注释来明确这一点。

例如。

class PublicInputData {
    //data members
 };
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top