c ++ struct OO vs class OO

时间:2011-12-19 08:40:12

标签: c++

  

可能重复:
  What are the differences between struct and class in C++
  class and struct in c++

看起来struct可以有构造函数和析构函数以及成员,看起来非常简单,所以我们可以使用struct而不是类,如果不是,我们什么时候才能使用struct和函数?

https://github.com/developmentseed/node-sqlite3/blob/master/src/database.h#L32

struct Baton {
    uv_work_t request;
    Database* db;
    Persistent<Function> callback;
    int status;
    std::string message;

    Baton(Database* db_, Handle<Function> cb_) :
            db(db_), status(SQLITE_OK) {
        db->Ref();
        uv_ref(uv_default_loop());
        request.data = this;
        callback = Persistent<Function>::New(cb_);
    }
    virtual ~Baton() {
        db->Unref();
        uv_unref(uv_default_loop());
        callback.Dispose();
    }
};

struct OpenBaton : Baton {
    std::string filename;
    int mode;
    OpenBaton(Database* db_, Handle<Function> cb_, const char* filename_, int mode_) :
        Baton(db_, cb_), filename(filename_), mode(mode_) {}
};

7 个答案:

答案 0 :(得分:3)

绝对没有技术理由偏爱其他人,但我注意到有关使用classstruct的某项约定。

如果你的数据类型是程序的其他部分使用的东西(即它是'界面'的一部分),那么通常人们会使它成为class以表明其重要性。如果数据类型仅用于函数或类的实现,并且在某个范围之外不可见,则将其设为struct

这些是一些非常激烈的指导方针,但如果你不遵守它们,就不会抱怨。


编辑:在C ++中,两者之间并没有真正的区别,但其他受C ++启发的新语言实际上使structclass不同。例如,在C#和D中,classstruct都用于定义数据类型,但它们不相同:struct被实现,因此它应该用于'小'types。

答案 1 :(得分:2)

唯一的区别是默认访问级别(类private,结构public)。除此之外,它们完全可以互换。你应该决定哪一个更好,并且一直使用它(一致性使你的代码更具可读性)。

答案 2 :(得分:2)

  

什么时候我们在使用类时使用struct和函数?

这完全是您的选择 没有什么可以用类做,而不是C ++中的结构。

只有结构和类别之间的区别是:

  • 访问说明符默认为class为private,struct为
  • 继承默认为类的private和struct
  • 的public

因此,只需使用您选择的一个并坚持使用它,不要混合类和结构。

答案 3 :(得分:1)

classstruct之间的唯一区别是其成员和基类的默认可访问性。 structpublicclassprivate

答案 4 :(得分:1)

正如其他结构和&amp; class除默认访问级别外没有任何区别。但是,通常的做法是使用结构主要用于数据聚合,因为这就是结构体缩减为C的结果。例如,根据我的经验,用户定义的POD几乎总是被创建为结构体。

答案 5 :(得分:0)

正如其他人所说,主要区别在于成员数据和功能的默认访问级别,即类的私有和结构的公共访问。默认继承访问级别也是如此:类为private,结构为public。

至于何时使用哪个,这是公司正常做的事情。根据我的经验,大多数公司,甚至是个人,使用结构来保存纯数据和类的数据包,用于存储对其自己的数据和/或结构进行操作的函数集合。

这种方法是C编程的回归,其中结构只能存储数据而不能存储函数,所以大多数人都喜欢在C ++中坚持这个定义。

请注意,对于仿函数使用结构体是很常见的,这似乎会通过不包含函数的结构代码来破坏一致性,但由于仿函数通常只会重载()运算符,所以我们仍保留某种形式的一致性。此外,它节省了我们必须为一个功能和/或继承结构键入公共...哦,我们允许自己避免的打字;)

答案 6 :(得分:-2)

是引用类型。创建类的对象时,为其分配对象的变量仅保留对该内存的引用。将对象引用分配给新变量时,新变量引用原始对象。通过一个变量进行的更改会反映在另一个变量中,因为它们都引用相同的数据。

struct 是值类型。创建结构时,为其分配结构的变量保存结构的实际数据。将结构分配给新变量时,会复制该变量。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。

通常,类用于建模更复杂的行为,或者在创建类对象后要修改的数据。结构最适合于小数据结构,主要包含在创建结构后不打算修改的数据。