C++ typedef struct vs class

C++ typedef struct vs class

本文关键字:class vs struct typedef C++      更新时间:2023-10-16

我对C++不是很熟悉,当我尝试一些测试程序时,我遇到了一个问题,如果我能这么说,最好在C++代码中定义一些原始元素。

让我们以一个描述矩形的类为例。它会创建它们,绘制它们,旋转,调整大小等...现在在大多数情况下,我们必须处理画布上的点。 矩形本身由 2 个点描述:左上角和右下角。 同样为了旋转它,你需要一个角度和一个点(锚点)。 或者,也许要移动它,您需要为给定矩形创建一个新的锚点。我想我在使用积分时表达了我的观点. 那么什么更有效呢?将此基元点定义为类还是结构?

class cPoint
{
public: 
int X;
int Y;
};

typedef struct
{
int X;
int Y;
}sPoint;

Niether 效率更高。 在技术层面上,除了成员的默认可见性(publicstruct中,privateclass中)和默认继承模型(structpublicprivateclass0中)之外,CC_1和struct之间没有区别。

他们typedef struct {} name模型在C++中不是惯用语。 事实上,这是一个可憎的东西——C的遗留物。 不要使用此模型。 请改用此struct name {};。 使用typedef struct {} name;模型不会在C++中获得任何好处(在 C 中需要它),并且可能会在可维护性方面花费您。 例如,可能更难greptypedef struct声明。 但是,由于这样做不会给您带来任何好处,因此没有令人信服的理由不简单地在C++中做struct name {};

除了技术问题,structclass之间的差异是语义上的。 声明为struct的对象是仅由public:数据成员(所谓的 POD)组成的简单对象,这是传统的,并且是预期的。 如果它具有privateprotected数据,预期派生自或具有任何方法,则将其声明为class

这个准则是可以解释的,只是——一个指导方针。 例如,没有什么可以阻止您将抽象基类声明为struct。 但是,您可能需要考虑遵循此准则,以便遵循最小意外原则,从而使您的代码更易于理解和维护。

两者几乎相同。更准确地说,struct {class {public:相同

优化编译器可能会生成完全相同的代码。使用 MELT 或简单地将-fdump-tree-all(请注意,该选项生成数百个转储文件)传递给g++(假设您使用最新的 GCC 编译器)——最好进行一些优化,如-O- 找出答案(或查看生成的汇编程序代码与g++ -O -fverbose-asm -S......

typedef struct实际上是C方法。在C++中,这两个版本看起来非常相似:编写的类和结构如下:

struct sPoint
{
int X;
int Y;
};

这两种形式在功能上是相同的,但你可以通过选择并坚持一些关于它们如何使用的约定,为你未来的维护者提供重要的信息。例如,一种方法是,如果您打算将数据元素设为私有并为其提供有用的方法(例如,如果您使用内联访问器,则可以在每次使用这些方法时插入打印调用),那么一定要使其成为一个类。如果您打算公开数据并作为成员访问它们,请使其成为结构。

classstruct之间没有性能差异

class默认为专用访问,而struct默认为公共访问。如果与C的互操作性对你来说是一个问题,那么你将不得不使用struct,显然它不能有任何成员函数。

顺便说一句,标准库中没有std::is_struct。相反,std::is_class 方法返回类型是类还是结构true

简单地说,第一种方式更C++,第二种方式更C。两者都有效,而第一种方法现在更"标准"。

C++ 中的结构就像默认情况下具有公共成员的类*

没有其他形式上的区别,尽管如果您开始使用结构作为类,您的代码可能会看起来令人困惑,尤其是数据隐私是主要好处的继承机制。

如果你要声明私有/受保护的成员,那么使用结构几乎没有意义,尽管你的代码仍然是100%合法的。


* 包括继承的成员,因为周围的狂热者和吹毛求疵者似乎认为这一点很重要,只有无知的希滕斯才会不提及它。
除了在 Stoustrup 圣经的另一节经文中定义了这个很好的教义点(或者更确切地说是暗示,因为基类只是定义继承成员的推论留给了读者的睿智)之外,恕我直言,真的没有什么可大惊小怪的。

要在示例中正确声明结构,请使用

struct sPoint {
int X;
int Y;
};

通常,C++中的结构和类是相同的,只是默认情况下数据在结构中是公共的。 另一个区别是 struct 关键字不能用作模板中的类型,尽管结构可以用作参数。

这里有一个更彻底的讨论:C++ - 结构与.class

从技术上讲,struct{}class{}是相同的。

它们在语义级别上有所不同,具有不同的成员可见性。

struct{...}相当于class{public:...}

而且,使用 struct 关键字声明类也是合法的。(添加成员函数,访问说明符到struct{})

通常,将struct用于普通旧数据 (POD) 类型,class用于面向对象类型以提高可读性。

typedef struct{}应该只用于隐藏实现细节(例如:向用户提供近源库)

在我看来,在您的情况下,使用struct更好,因为Point的成员需要由其他代码直接修改。