在c++中,在哪些情况下使用结构体比使用类更好?
当前回答
只是从c++ 20 standard的角度(从N4860工作)来解决这个问题…
类是一种类型。关键字“class”和“struct”(以及“union”)在c++语法中是“class-key”,选择class或struct的唯一功能意义是:
类键决定是否…默认情况下访问是public或private(11.9)。
数据成员默认可访问性
class关键字的结果是private-by-default成员,而' struct关键字的结果是public-by-default成员,在11.9.1的例子中有说明:
类X { int;// X::a默认为private:使用的类
对…
struct S { int;// S::a默认为public: struct被使用
基类默认可访问性
1.9还说:
在基类没有访问说明符的情况下,当派生类使用类键结构体定义时假定为public,当类使用类键类定义时假定为private。
需要一致使用结构体或类的情况……
有一个要求:
在类模板的重声明、部分特化、显式特化或显式实例化中,类键应与原始类模板声明一致(9.2.8.3)。
...在任何详细类型说明符中,枚举关键字应使用指向枚举(9.7.1),联合类键应使用指向联合(11.5),类或结构的类键必须是 用于指非并体类(11.1)。
以下是不需要一致性的例子:
struct S {} S; 类S* p = &s;/ /好吧
不过,一些编译器可能会对此提出警告。
有趣的是,虽然你用struct、class和union创建的类型都被称为“类”,但我们有…
标准布局结构体是用类键结构体或类键类定义的标准布局类。
...所以在标准语中,当谈到标准布局结构体时,它使用“struct”来暗示“不是联合”。
我很好奇在其他术语中是否也有类似的“struct”用法,但要对标准进行详尽的搜索,工作量太大了。欢迎对此发表评论。
其他回答
我从来不在c++中使用struct。
我无法想象在需要私有成员时使用结构体的场景,除非您故意试图混淆。
使用结构体似乎更像是一种如何使用数据的语法指示,但我宁愿只创建一个类,并尝试在类的名称中显式地表示它,或通过注释。
E.g.
class PublicInputData {
//data members
};
类。
默认情况下,类成员是私有的。
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表示数据结构,其中成员可以取任何值 那样容易些。
它们几乎是一样的。由于c++的魔力,结构体可以像类一样保存函数、使用继承、使用“new”创建等等
唯一的功能区别是类以私有访问权限开始,而结构以public开始。这是对C语言的向后兼容。
在实践中,我总是使用结构体作为数据持有者,类作为对象。
默认情况下,所有类成员都是私有的,所有结构成员都是公共的。 类有默认的私有基,Struct有默认的公共基。Struct在C中不能有成员函数,而在c++中可以有成员函数被添加到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 student -喜欢。