在c++中,在哪些情况下使用结构体比使用类更好?


当前回答

它们是一样的,只是默认值不同(class默认为private, struct默认为public),所以理论上它们是完全可以互换的。

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

其他回答

正如其他人指出的那样

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

关于何时使用Stroustrup/Sutter给出了明确的建议:

如果类有不变量,则使用class;如果数据成员可以独立变化,则使用struct

然而,请记住,将某事物前向声明为类(class X;)并将其定义为struct (struct X{…})。 它可能在某些链接器上工作(例如g++),但可能在其他链接器上失败(例如MSVC),所以你会发现自己陷入了开发人员的地狱。

类。

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

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++中类和结构的区别是:

结构成员和基类/结构在默认情况下是公共的。 默认情况下,类成员和基类/结构是私有的。

类和结构都可以混合使用public、protected和private成员,可以使用继承,也可以有成员函数。

我向你推荐:

对于没有任何类样特性的普通旧数据结构使用struct; 在使用私有或受保护成员、非默认构造函数和操作符等特性时使用类。

在用我的主要语言c++编程多年之后,我得出了一个死结论,那就是这是c++的另一个愚蠢的特性。

两者之间没有真正的区别,我也没有理由花额外的时间来决定是应该将实体定义为结构体还是类。

要回答这个问题,请随时将实体定义为结构。默认情况下,成员将是公开的,这是规范。但更重要的是,默认情况下继承将是公开的。受保护继承和更糟糕的私有继承是例外。

我从来没有遇到过私人继承是正确做法的案例。是的,我试图发明问题来使用私有继承,但它不起作用。如果不使用访问器关键字,面向对象编程的角色模型Java默认为公共继承。顺便提一下,Java不允许在继承类上访问关键字,它们只能被公开继承。所以你可以看到,cpp团队在这里真的很失败。

另一件令人沮丧的事情是,如果你定义为类,声明为结构,你会得到编译警告。就好像这是影响程序性能或准确性的东西一样。一个回答还指出,MSVC可能会产生编译器错误。

Those persons that use classes when it is raining and structs when it is shining are doing so based on what they have been taught. It's not something they discovered to be true. Java does not have a pair of names for classes, and only have the class keyword. If you want a data structure, simply make all your members public and don't add functions. This works in Java and I don't see any problem. What's the problem? You need 4 or 5 characters of BOM code to determine how to interpret the context of a class entity.

现有的答案中有很多误解。

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成员;,并且与类或结构的语义无关。