什么时候应该在C ++中使用类和结构?

在哪种情况下最好在C ++中使用structclass


C ++中classstruct之间的区别在于,结构具有默认的public成员,并且基类和类具有默认的private成员和基础。 类和结构都可以有public成员和private成员的混合,可以使用继承并可以具有成员函数。

我会推荐使用结构作为普通的旧数据结构,没有任何类特征,并将类用作具有private数据和成员函数的聚合数据结构。


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

  • struct默认为公共访问, class默认为私有访问。
  • 继承时, struct默认为public继承, class默认为private继承。 (具有讽刺意味的是,与C ++中的许多事情一样,默认值是倒退: public继承是更常用的选择,但人们很少声明struct s只是为了节省输入“ public ”关键字。
  • 但实际上的真正区别在于声明构造函数/析构函数的class / struct和不具有构造函数/析构函数的class / struct之间。 对于“普通旧数据”POD类型有一定的保证,一旦接管课程结构就不再适用。 为了保持这种区分清晰,许多人故意只使用POD类型的struct s,并且如果他们打算添加任何方法,则使用class es。 下面这两个片段之间的区别是没有意义的:

    class X
    {
      public:
    
      // ...
    };
    
    struct X
    {
      // ...
    };
    

    (顺便提一下,下面是一个关于“POD类型”实际意义的一些很好解释的线程:C ++中的POD类型是什么?)


    现有答案中有很多误解。

    classstruct声明一个类。

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

    但是,除了语法之外,选择其中一个的唯一理由是约定/风格/偏好。

    有些人喜欢在不使用成员函数的情况下坚持使用struct关键字,因为结果定义“看起来像”一个来自C的简单结构。

    同样,有些人喜欢将class关键字用于具有成员函数和private数据的类,因为它上面写着“class”,因此看起来就像他们最喜欢的面向对象编程的书中的例子。

    现实情况是,这完全取决于你和你的团队,并且它对你的程序没有任何影响。

    除了他们的名字以外,以下两类在各方面都是绝对相同的:

    struct Foo
    {
       int x;
    };
    
    class Bar
    {
    public:
       int x;
    };
    

    您可以在重新声明时切换关键字:

    class Foo;
    struct Bar;
    

    (尽管一些编译器会在你这样做的时候发出警告,假设你可能不打算做一些令人困惑的事情,因此应该提示你仔细检查你的代码。)

    并且以下表达式都计算为真:

    std::is_class<Foo>::value
    std::is_class<Bar>::value
    

    但请注意,重新定义时不能切换关键字; 这只是因为(根据单定义规则)跨转换单元的重复类定义必须“由相同的标记序列组成”。 这意味着你甚至不能交换const int member;int const member; ,并且与classstruct的语义无关。

    链接地址: http://www.djcxy.com/p/28055.html

    上一篇: When should you use a class vs a struct in C++?

    下一篇: When are structs the answer?