什么时候应该在C ++中使用类和结构?
在什么情况下最好使用一个struct
与C ++中的class
?
C ++中class
和struct
之间的区别在于,结构有默认的public
成员,而基类和类有默认的private
成员和基础。 这两个类和结构都可以有public
和private
成员的混合,可以使用inheritance,并且可以具有成员函数。
我会build议使用结构作为普通的旧数据结构没有任何类的function,并使用类作为聚合数据结构与private
数据和成员函数。
正如其他人所指出的,实际上只有两种语言差异:
-
struct
默认为公共访问和class
默认为私人访问。 - inheritance时,
struct
默认为public
inheritance,class
默认为private
inheritance。 (具有讽刺意味的是,与C ++中的许多事情一样,默认是向后的:public
inheritance是更常用的select,但是人们很less声明struct
来保存input“public
”关键字。
但是实际上真正的区别在于声明构造/析构函数的class
/ struct
没有声明的class
/ struct
之间。 对于“简单的旧数据”PODtypes有一定的保证,一旦接pipe课程的build设就不再适用了。 为了保持这种区分的清晰,许多人故意只使用struct
的PODtypes,如果他们要添加任何方法,使用class
ES。 下面两个片段之间的区别是没有意义的:
class X { public: // ... }; struct X { // ... };
(顺便说一下,下面是一个关于“PODtypes”实际意义的一些很好的解释的线程: C ++中的PODtypes是什么? )
现有答案中有很多误解。
class
和struct
声明一个类。
是的,您可能需要重新排列类定义中的访问修改关键字,具体取决于您用来声明类的关键字。
但是,除了语法之外,select其中之一的唯一理由是约定/风格/偏好。
有些人喜欢在没有成员函数的情况下坚持使用struct
关键字,因为结果定义“看起来像”C中的简单结构。
同样,有些人喜欢使用class
关键字的成员函数和private
数据类,因为它说“类”,因此看起来像他们最喜欢的书面向对象编程的例子。
实际情况是,这完全取决于你和你的团队,对于你的程序来说,这几乎没有任何区别。
除了他们的名字,以下两类在各方面都是绝对相同的:
struct Foo { int x; }; class Bar { public: int x; };
您甚至可以在重新声明时切换关键字:
class Foo; struct Bar;
(虽然有些编译器会在你这样做的时候发出警告,假设你可能不打算做一些令人困惑的事情,因此应该提示你仔细检查你的代码。)
并且以下expression式都计算为真:
std::is_class<Foo>::value std::is_class<Bar>::value
我只使用一个结构而不是一个类的时候,是在函数调用中使用函数之前声明一个函数,并且为了清楚起见,为了最小化语法。 例如:
struct Compare { bool operator() { ... } }; std::sort(collection.begin(), collection.end(), Compare());
从C ++ FAQ Lite :
结构的成员和基类是默认公开的,而在类中,它们默认是私有的。 注意:您应该使您的基类明确公开,私有或受保护,而不是依靠默认值。
结构和类在function上是等价的。
好吧,足够的那个尖锐的清洁技术讲座。 在情感上,大多数开发人员在类和结构之间进行了强烈的区分。 结构只是感觉像一堆开放的东西,封装或function很less。 一个class级感觉自己像一个活跃和负责任的社会成员,拥有智能化的服务,强大的封装屏障,以及明确的界面。 由于这是大多数人已经拥有的内涵,所以如果你有一个只有很less方法和公共数据的类(这些东西确实存在于devise良好的系统中),你应该使用struct关键字,否则你应该使用类关键词。
一个结构对我有帮助的地方是当我有一个系统从另一个系统接收固定格式的消息(比如说一个串口)。 您可以将字节stream转换为定义您的字段的结构,然后轻松访问这些字段。
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 ++代码调用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 ++还有其他一些注意事项,但这是一个简单的例子。
正如每个人所说,唯一真正的区别是默认访问。 但我特别使用结构,当我不想用任何简单的数据类封装,即使我实现一些辅助方法。 例如,当我需要这样的东西:
struct myvec { int x; int y; int z; int length() {return x+y+z;} };
当你为C ++实现提供一个C兼容的接口时,结构( PODs ,更一般地说)很方便,因为它们可以跨语言边界和连接器格式移植。
如果这不是你的问题,那么我认为使用“结构”而不是“类”是一个很好的意图沟通(正如@ZeroSignal上面所说的)。 结构还具有更多可预测的复制语义,所以它们对于打算写入外部介质或通过networking发送的数据非常有用。
结构对于各种元编程任务来说也很方便,就像traits模板一样,只是暴露了一大堆相关的typedef:
template <typename T> struct type_traits { typedef T type; typedef T::iterator_type iterator_type; ... };
…但是这真的只是利用struct的默认保护级别被公开…
对于C ++来说,结构和类之间确实没什么区别。 主要的function区别在于一个结构体的成员默认是公共的,而在类中默认是私有的。 否则,就语言而言,它们是等同的。
也就是说,我倾向于像在C#中一样使用C ++中的结构,类似于Brian所说的。 结构是简单的数据容器,而类则用于需要对数据执行操作的对象。
为了回答我自己的问题(无耻地),如前所述,访问权限是它们在C ++中的唯一区别。
我倾向于只使用一个结构来存储数据。 如果使数据更容易处理,我将允许它获得一些帮助函数。 然而,只要数据需要stream量控制(即保持或保护内部状态的获取/设置器)或开始应对任何主要function(基本上更像对象),它将被升级为一个类,以更好地交stream意图。
他们几乎是一回事。 感谢C ++的魔力,一个结构可以保存函数,使用inheritance,使用“new”等创build,就像一个类
唯一的function区别是一个类以私有访问权限开始,而一个结构以public开始。 这是与C保持向后兼容
在实践中,我一直使用结构作为数据持有者和类作为对象。
它们具有不同的默认值(默认为private,默认为struct
),所以理论上它们是完全可以互换的。
所以,如果我只想打包一些信息来移动,我使用一个结构,即使我把几个方法(但不是很多)。 如果这是一个几乎不透明的东西,主要用途是通过方法,而不是直接的数据成员,我使用一个完整的类。
结构默认情况下具有公共访问权限,而类别默认情况下具有私有权限。
我个人使用数据传输对象或价值对象的结构。 当这样使用时,我声明所有成员为const,以防止被其他代码修改。
你什么时候会select使用struct,何时使用C ++中的类?
当我定义functors
和POD
时使用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; } };
我只使用结构,当我需要保存一些数据没有任何成员函数关联(操作成员数据),并直接访问数据variables。
例如:从文件和套接字stream中读取/写入数据等。在函数参数太多且函数语法看起来太冗长的结构中传递函数参数。
从技术上讲,除了默认的可访问性,类和结构之间没有太大的区别。 更多的取决于编程风格如何使用它。
从技术上来说,在C ++中都是一样的,例如,一个结构体可能有重载操作符等等。
但是:
当我想要同时传递多种types的信息时,我使用结构体当我正在处理一个“function”对象时,我使用类。
希望它有帮助。
#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 – 享受。
当我需要创buildPODtypes或函子时,我使用结构。
类。
class级成员默认是私人的。
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; };
我使用数据结构的结构,其成员可以采取任何价值,这是更容易的方式。
我认为Structs的目的是作为一个数据结构(就像一个多数据types的信息数组),类被包含在代码包中(像子程序和函数的集合)。
🙁
我从来不使用C ++中的“结构”。
我不能想象一个场景,当你想要私人成员时,你会使用一个结构,除非你故意要混淆。
看起来,使用结构更像是数据如何被使用的句法指示,但我宁愿只是创build一个类,并尝试使用类的名称或通过注释来明确表示。
例如
class PublicInputData { //data members };
访问函数不是结构和类之间的唯一区别。 对于POD(普通旧数据)types,结构更好,因为编译器和程序员更容易pipe理。 对于不使用面向对象编程的初学者来说,使用一个结构体是可以的。