【问题标题】:In general, how to chose between a struct and a class in C++一般来说,如何在 C++ 中的结构和类之间进行选择
【发布时间】:2012-11-24 16:39:44
【问题描述】:

这是一个非常简单的问题,但我似乎找不到在某些情况下选择一个而不是另一个的一般规则。

假设我有一个简单的Point 类,如下所示:

class Point
{
public:
    Point();
    Point(double, double, double);

    Point(const Point& other);
    Point& operator=(const Point& other);

    bool operator==(Point& lhs, Point& rhs);

    void translate(double, double, double);

    double getX() const;
    double getY() const;    
    double getZ() const;

    void setX(const double);
    void setY(const double);
    void setZ(const double);

private:
    double x_, y_, z_;
}

好吧,但是为什么不把它做成一个带有公共 x、y、z 的结构并节省一半的代码呢?

另一个例子假设我有一个像这样的Header 结构:

struct Header
{
    short int id;
    short int version;        
    size_t indexOffset;
    size_t indexSize;
}

在什么情况下我想让它成为一个类?上述内容与我在这样的质量代码中也看到的内容之间是否有任何区别:

class Header
{
public:
    short int id;
    short int version;        
    size_t indexOffset;
    size_t indexSize;
}

所以我想这个问题的一个子问题是我如何决定何时将成员变量设为私有。我知道 OO 纯粹主义者可能会说总是,但我不确定它的好处。

非常感谢。

【问题讨论】:

标签: c++ oop class struct


【解决方案1】:
regarding class vs. struct :

如果不需要成员函数,请使用 struct,否则使用类。

regarding getters and setters :

如果您需要直接访问成员 - 将其公开。将它们设为私有并通过 getter/setter 访问的唯一原因是,如果您在访问它们时需要执行某种处理,例如检查有效性或重新计算其他依赖成员。

【讨论】:

  • 好吧,OO 纯粹主义者仍然会说:如果有一天您在获取或设置变量时需要进行一些检查,那么它们都应该是私有的。
  • 我会说,当我需要检查时,我会添加它。但是,私人/公共成员可能存在另一种类型的问题:如果您在一个非常大的团队中工作或泄露您的资源,那么最好不要暴露容易损坏的部分,而是创建某种 API并只允许通过此 API 访问防火墙不良行为和无效参数。即使在这种情况下,在内部,您的课程仍然可以按照您的意愿公开。
【解决方案2】:

感谢 Bo Persson 提供的链接,我发现以下是相关的答案:

结构的成员和基类默认是公共的,而 在课堂上,他们默认为私人。注意:你应该做你的基地 明确地公开、私有或受保护的类,而不是依赖于 在默认值上。

结构和类在其他方面在功能上是等效的。

好了,干脆利落的 techno 谈话就讲完了。感情上,大部分 开发人员对类和结构进行了严格区分。一种 struct 感觉就像一堆开放的位,其中很少 封装或功能的方式。一堂课感觉就像一个生活和 负责任的社会成员,智能服务,强大的 封装屏障和定义良好的接口。既然那是 大多数人已经拥有的内涵,您可能应该使用 struct 关键字,如果你有一个方法很少的类并且有 公共数据(这些东西确实存在于设计良好的系统中!),但是 否则你可能应该使用 class 关键字。

您使用哪种风格取决于环境和品味。我通常 更喜欢将 struct 用于所有数据都公开的类。我想 诸如“不是很合适的类型,只是数据结构”之类的类。

来源:
http://www.parashift.com/c++-faq/struct-vs-class.html
http://www.amazon.com/dp/0201700735/?tag=stackoverfl08-20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2023-03-25
    • 2012-11-27
    • 2011-01-24
    相关资源
    最近更新 更多