C ++ typedef struct vs class

时间:2014-01-24 17:03:10

标签: c++ class struct typedef

我对C ++并不是很熟悉,当我尝试一些测试程序时,如果我可以这样说来在C ++代码中定义一些原始元素,我就会遇到关于 best 的问题。 / p>

我们来看一个描述矩形的类。它会创建它们,绘制它们,旋转,调整大小等等......现在在大多数情况下我们必须处理画布上的点。 其自身的矩形由2个点描述:左上角和右下角。 另外,为了旋转它,您需要一个角度和一个点(锚点)。 或者可能要移动它,您需要一个给定矩形的新锚点。我想我使用积分点了点。 那么什么更有效?将此原始定义为类还是结构?

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

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

8 个答案:

答案 0 :(得分:13)

Niether效率更高。在技​​术层面上,classstruct除了成员的默认可见性(public structprivate class之外没有区别1}})和默认继承模型public中的structprivate中的class

他们typedef struct {} name模型在C ++中不是惯用的。事实上,这是一种憎恶 - 来自C的延续。不要使用这种模式。请改用此struct name {};。使用typedef struct {} name;模型不会在C ++中获得任何东西(在C中需要它),并且在可维护性方面可能会花费你很多东西。例如,对grep声明typedef struct可能更难。但是,由于它没有通过这样做获得任何好处,因此没有令人信服的理由不在C ++中简单地执行struct name {};

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

本指南可以解释,只是 - 指南。例如,没有什么可以阻止您将抽象基类声明为struct。但是,您可能需要考虑遵循此指南,以便遵循Principle of Least Surprise,从而使您的代码更易于理解和维护。

答案 1 :(得分:4)

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

相同

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

答案 2 :(得分:4)

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

struct sPoint
{
 int X;
 int Y;
};

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

答案 3 :(得分:3)

classstruct

之间没有性能差异

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

另外,标准库中没有std::is_struct。相反,如果类型是类或结构,则std::is_class方法返回true

答案 4 :(得分:1)

简单地说,第一种方式是更多C ++,第二种方式更多是C.两种方法都有效,而第一种方式现在更“标准化”。

答案 5 :(得分:1)

C ++中的结构就像一个默认拥有公共成员的类 *

没有其他正式的区别,但如果你开始使用结构作为类,你的代码可能看起来很混乱,尤其是数据隐私是主要好处的继承机制。

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


* 包括继承的成员,因为周围的狂热者和挑衅者似乎认为这一点具有重要意义,只有无知的神秘主义者才会提及它。
除了在Stoustrup圣经的另一节经文中定义这个精细学说点(或者更确切暗示,因为推断基类只是定义继承成员的推论留给读者的睿智)这一事实之外,实际上并没有什么可以做的。对IMHO大惊小怪。

答案 6 :(得分:1)

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

struct sPoint {
    int X;
    int Y;
};

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

这里有一个更全面的讨论:C++ - struct vs. class

答案 7 :(得分:1)

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

它们在语义层面上存在差异,具有不同的成员可见性。

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

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

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

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

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