在c++中,在哪些情况下使用结构体比使用类更好?
当前回答
回答我自己的问题(无耻地),正如已经提到的,访问权限是c++中它们之间的唯一区别。
我倾向于仅将结构体用于数据存储。我将允许它获得一些帮助函数,如果它使处理数据更容易的话。然而,一旦数据需要流控制(即维护或保护内部状态的getter /setter)或开始获得任何主要功能(基本上更像对象),它将被“升级”为一个类,以更好地传达意图。
其他回答
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++中是相同的——例如,结构体可能具有重载操作符等。
然而:
当我希望同时传递多种类型的信息时,我使用结构体 当我处理一个“功能性”对象时,我使用类。
希望能有所帮助。
#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 -喜欢。
回答我自己的问题(无耻地),正如已经提到的,访问权限是c++中它们之间的唯一区别。
我倾向于仅将结构体用于数据存储。我将允许它获得一些帮助函数,如果它使处理数据更容易的话。然而,一旦数据需要流控制(即维护或保护内部状态的getter /setter)或开始获得任何主要功能(基本上更像对象),它将被“升级”为一个类,以更好地传达意图。
类。
默认情况下,类成员是私有的。
class test_one {
int main_one();
};
等于
class test_one {
private:
int main_one();
};
所以如果你尝试
int two = one.main_one();
我们将得到一个错误:main_one是私有的,因为它不可访问。我们可以 通过指定它的公共ie来初始化它来解决它
class test_one {
public:
int main_one();
};
结构体。
struct是一个类,其成员默认为public。
struct test_one {
int main_one;
};
意味着main_one是私有的,即
class test_one {
public:
int main_one;
};
我用struct表示数据结构,其中成员可以取任何值 那样容易些。
现有的答案中有很多误解。
class和struct都声明一个类。
是的,您可能必须在类定义中重新安排访问修改关键字,这取决于您用于声明类的关键字。
但是,除了语法之外,选择一种而不是另一种的唯一原因是惯例/风格/偏好。
有些人喜欢对没有成员函数的类坚持使用struct关键字,因为最终的定义“看起来像”C中的简单结构。
类似地,有些人喜欢对具有成员函数和私有数据的类使用class关键字,因为它表示“类”,因此看起来像他们最喜欢的面向对象编程书籍中的示例。
实际上,这完全取决于您和您的团队,这对您的程序没有任何影响。
下面这两个类除了名字以外在其他方面都是完全等价的:
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成员;,并且与类或结构的语义无关。