首页 文章

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

提问于
浏览
775

在什么情况下,在C中使用 structclass 会更好?

25 回答

  • 182

    它们几乎是一回事 . 由于C的魔力,结构可以保存函数,使用继承,使用“new”创建,就像类一样

    唯一的功能区别是类以私有访问权限开头,而结构以public开头 . 这是与C保持向后兼容性 .

    在实践中,我总是使用结构作为数据持有者和类作为对象 .

  • 1

    对于C,结构和类之间确实没有太大区别 . 主要功能区别在于,结构的成员默认是公共的,而在类中默认是私有的 . 否则,就语言而言,它们是等价的 .

    也就是说,我倾向于在C中使用C语言中的结构,就像我在C#中所做的那样,类似于Brian所说的 . 结构是简单的数据容器,而类用于需要对数据执行操作的对象,而不仅仅是保持数据 .

  • 2

    我推荐 not to mix struct s和 class es .

    正如其他人所指出的那样

    除了默认可见性之外,

    • 都是等效的

    • 可能有理由因任何原因被迫使用这一个或另一个

    除非你被迫, go with only structs or only classes because it protects you from cryptic linker problems with zero cost .

    如果你转发声明......比如 class X; ,后来将它定义为 struct X { ... } 它可能适用于某些链接器(例如,g)并且可能在其他链接器上失败(例如,MSVC),因此您将发现自己处于开发人员的地狱中 . 由于没有理由混淆 structclass ,为什么一个人认为更复杂并且关心那个东西是 class 还是 struct

  • 2

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

    • struct 默认为公共访问, class 默认为私人访问 .

    • 继承时, struct 默认为 public 继承, class 默认为 private 继承 . (具有讽刺意味的是,与C中的许多内容一样,默认值是向后的: public 继承是迄今为止更常见的选择,但人们很少声明 struct 只是为了节省输入“ public ”关键字 .

    但实践中的真正区别在于声明构造函数/析构函数的 class / struct 和不构造构造函数的析构函数 . 为了明确这一区别,许多人故意仅将 struct 用于POD类型,如果他们要添加任何方法,请使用 class es . 下面两个片段之间的区别是没有意义的:

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

    (顺便提一下,这里有一个关于"POD type"实际意味着什么的一些好解释的帖子:What are POD types in C++?

  • -5

    我认为Structs旨在作为数据结构(如多数据类型的信息数组),并且类被用于代码打包(如子程序和函数的集合) .

    :(

  • 1

    从技术上讲,两者在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学生 - 享受 .

  • 0

    当您跨语言边界和链接器格式移植时,结构(更常见的是PODs)非常方便 .

    如果你不关心这一点,那么我认为使用“struct”代替“class”是一个很好的意向沟通者(正如@ZeroSignal所说) . 结构也具有更可预测的复制语义,因此它们对于您打算写入外部媒体或通过线路发送的数据非常有用 .

    结构对于各种元编程任务也很方便,比如只显示一堆依赖typedef的traits模板:

    template <typename T> struct type_traits {
      typedef T type;
      typedef T::iterator_type iterator_type;
      ...
    };
    

    ......但这真的只是利用struct的默认保护级别是公开的......

  • -3

    我唯一一次使用struct而不是类是在函数调用中使用它之前声明一个仿函数,并且为了清晰起见,希望最小化语法 . 例如 . :

    struct Compare { bool operator() { ... } };
    std::sort(collection.begin(), collection.end(), Compare());
    
  • 1

    它们具有不同的默认值(默认为 class 为私有, struct 默认为public),因此理论上它们完全可以互换 .

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

  • 16

    默认情况下,所有类成员都是私有的,并且所有struct成员都是公共的 . 类具有默认私有基础,而Struct具有默认公共基础 . 在C的情况下,struct不能具有成员函数,而在C的情况下,我们可以将成员函数添加到结构中 . 除了这些差异,我没有发现任何令人惊讶的事情 .

  • 1

    结构对我有用的一个地方就是我有一个系统从另一个系统接收固定格式的消息(比如说,一个串口) . 您可以将字节流强制转换为定义字段的结构,然后轻松访问字段 .

    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中做的一样,但我发现必须将消息解码为类的开销通常是不值得的 .

  • 12

    默认情况下,结构具有公共访问权限,默认情况下类具有私有访问权限 .

    我个人使用数据传输对象的结构或值对象 . 当我这样使用时,我宣布所有成员为const以防止其他代码修改 .

  • 33

    我只在需要保存一些数据而没有任何与之关联的成员函数(对成员数据进行操作)并直接访问数据变量时才使用struct .

    例如:从文件和套接字流中读取/写入数据等 . 在函数参数太多而函数语法看起来过于冗长的结构中传递函数参数 .

    从技术上讲,除了默认可访问性之外,类和结构之间没有很大的区别 . 更多内容取决于编程风格如何使用它 .

  • -6

    正如每个人所说,唯一真正的区别是默认访问 . 但是,当我不想使用简单的数据类进行任何类型的封装时,我特别使用struct,即使我实现了一些辅助方法 . 例如,当我需要这样的东西时:

    struct myvec {
        int x;
        int y;
        int z;
    
        int length() {return x+y+z;}
    };
    
  • 9

    当我需要创建POD类型或仿函数时,我使用结构 .

  • 661

    访问函数不是结构和类之间的唯一区别 . 对于POD(普通旧数据)类型,结构更好,因为它更易于管理编译器和程序员 . 对于不使用面向对象编程的初学者,使用结构很好 .

  • 7

    回答我自己的问题(无耻地),如前所述,访问权限是C中它们之间的唯一区别 .

    我倾向于仅使用结构进行数据存储 . 如果它更容易处理数据,我将允许它获得一些辅助函数 . 但是,只要数据需要流控制(即维护或保护内部状态的getter / setter)或开始获取任何主要功能(基本上更像对象),它就会“升级”到类以更好地传达意图 .

  • 51

    您何时会选择使用struct以及何时在C中使用class?

    当我定义 functorsPOD 时,我使用 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; }
    };
    
  • 1

    现有答案中存在许多误解 .

    Both class and struct declare a class.

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

    但是,除了语法之外,选择一个而不是另一个的唯一原因是约定/样式/偏好 .

    有些人喜欢坚持使用没有成员函数的类的 struct 关键字,因为结果定义"looks like"来自C的简单结构 .

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

    现实情况是,这完全取决于您和您的团队,并且它与您的计划完全没有任何区别 .

    除了名称之外,以下两个类在各方面都是完全相同的:

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

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

    class Foo;
    struct Bar;
    

    (虽然有些编译器在你这样做时会发出警告,假设你可能不打算做那么混乱的事情,因此应该提示你仔细检查你的代码 . )

    并且以下表达式都评估为true:

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

    但请注意,重新定义时无法切换关键字;这只是因为(根据单一定义规则)跨翻译单元的重复类定义必须"consist of the same sequence of tokens" . 这意味着您甚至无法与 int const member; 交换 const int member; ,并且与 classstruct 的语义无关 .

  • 4

    struct 优于 class 的一个优点是,如果遵守"first public members, then private",它将保存一行代码 . 在这种情况下,我发现关键字 class 无用 .

    这是仅使用 struct 而从不 class 的另一个原因 . C的一些代码样式指南建议对函数宏使用小写字母,其基本原理是当宏转换为内联函数时,名称不需要更改 . 同样在这里 . 你有一个漂亮的C风格的结构,有一天,你发现你需要添加一个构造函数,或者一些方便的方法 . 你把它改成 class 吗?到处?

    区分 structclass es是太麻烦了,妨碍我们应该做的事情 - 编程 . 像C的许多问题一样,它出自强者对后向兼容性的渴望 .

  • 21

    如果要编写内部为C的库,则可以在C中使用“struct”,但可以通过C或C代码调用API . 您只需创建一个包含结构和全局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时还有其他注意事项,但这是一个简化的例子 .

  • 5

    班 .

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

    class test_one {
        int main_one();
    };
    

    相当于

    class test_one {
      private:
        int main_one();
    };
    

    所以,如果你尝试

    int two = one.main_one();
    

    我们将收到错误: main_one is private 因为无法访问 . 我们可以通过指定它的公共来初始化它来解决它

    class test_one {
      public:
        int main_one();
    };
    

    Struct .

    结构是一个默认情况下成员是公共的类 .

    struct test_one {
        int main_one;
    };
    

    意味着 main_one 是私人的,即

    class test_one {
      public:
        int main_one;
    };
    

    我将结构用于数据结构,其中成员可以获取任何值,这样更容易 .

  • 117

    我从不在C中使用“struct” .

    我想不到你想要私人成员时使用结构的场景,除非你故意试图让人困惑 .

    似乎使用结构更多地是关于如何使用数据的语法指示,但我宁愿只创建一个类并尝试在类的名称或通过注释进行显式化 .

    例如 .

    class PublicInputData {
        //data members
     };
    
  • 3

    C中的 classstruct 之间的差异是结构具有默认的 public 成员,而基础和类具有默认的 private 成员和基础 . 类和结构都可以混合 publicprotectedprivate 成员,可以使用继承并且可以具有成员函数 .

    我建议使用结构作为普通旧数据结构而不使用任何类类特性,并使用类作为具有 private 数据和成员函数的聚合数据结构 .

  • 1

    来自C++ FAQ Lite

    默认情况下,结构的成员和基类是公共的,而在类中,它们默认为私有 . 注意:您应该明确公开,私有或保护基类,而不是依赖于默认值 . struct和class在功能上是等价的 . 好的,足够的那个干净的技术谈话 . 在情感上,大多数开发人员在类和结构之间做出了很强的区分 . 结构只是感觉像一堆开放的位,几乎没有封装或功能 . 课程感觉像是一个生活和负责任的社会成员,拥有智能服务,强大的封装屏障和明确的界面 . 既然这是大多数人已经拥有的内涵,那么你应该使用struct关键字,如果你有一个只有很少的方法并且有公共数据的类(这样的东西确实存在于设计良好的系统中!),否则你应该使用这个类关键词 .

相关问题