C++ typedef struct vs class
C++ typedef struct vs class
我对C++不是很熟悉,当我尝试一些测试程序时,我遇到了一个问题,如果我能这么说,最好在C++代码中定义一些原始元素。
让我们以一个描述矩形的类为例。它会创建它们,绘制它们,旋转,调整大小等...现在在大多数情况下,我们必须处理画布上的点。 矩形本身由 2 个点描述:左上角和右下角。 同样为了旋转它,你需要一个角度和一个点(锚点)。 或者,也许要移动它,您需要为给定矩形创建一个新的锚点。我想我在使用积分时表达了我的观点. 那么什么更有效呢?将此基元点定义为类还是结构?
class cPoint
{
public:
int X;
int Y;
};
或
typedef struct
{
int X;
int Y;
}sPoint;
Niether 效率更高。 在技术层面上,除了成员的默认可见性(public
在struct
中,private
在class
中)和默认继承模型(struct
中public
,private
在class
0中)之外,CC_1和struct
之间没有区别。
他们typedef struct {} name
模型在C++中不是惯用语。 事实上,这是一个可憎的东西——C的遗留物。 不要使用此模型。 请改用此struct name {};
。 使用typedef struct {} name;
模型不会在C++中获得任何好处(在 C 中需要它),并且可能会在可维护性方面花费您。 例如,可能更难grep
typedef struct
声明。 但是,由于这样做不会给您带来任何好处,因此没有令人信服的理由不简单地在C++中做struct name {};
。
除了技术问题,struct
和class
之间的差异是语义上的。 声明为struct
的对象是仅由public:
数据成员(所谓的 POD)组成的简单对象,这是传统的,并且是预期的。 如果它具有private
或protected
数据,预期派生自或具有任何方法,则将其声明为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;
};
这两种形式在功能上是相同的,但你可以通过选择并坚持一些关于它们如何使用的约定,为你未来的维护者提供重要的信息。例如,一种方法是,如果您打算将数据元素设为私有并为其提供有用的方法(例如,如果您使用内联访问器,则可以在每次使用这些方法时插入打印调用),那么一定要使其成为一个类。如果您打算公开数据并作为成员访问它们,请使其成为结构。
class
和struct
之间没有性能差异
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
的成员需要由其他代码直接修改。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- C++ class vs a library
- * vs & Arduino Class
- C++ typedef struct vs class
- class::data_member vs class_object.data_member
- getInstance - Class vs Method static
- VS 2011 template class
- c++ struct OO vs class OO
- 当内部类是class vs struct时,不可访问的基类
- 在traits中定义类型vs在class中定义类型
- VS 2010 C++智能感知 "a storage class may not be specified here"即使它可以?