具有一个成员或仅typedef的结构
Struct with one member or just typedef
在im编码时,我声明结构或类,因为它们基于真实世界的对象/思想/概念。
但这些结构/类通常只有一个成员。所以我想知道这是否有什么不同,如果我只是做一个typedef。
然后我不确定这是否正确,因为在我看来typedef不是"对象"。
那么我应该怎么做:
struct Y { int x; }
或者只是:
typedef int Y;
这有什么不同吗?我认为structs是对象,typedef是其他正确的东西吗?
这是一个巨大的差异。使用typedef,以下所有内容都有效:
Y y = 14.3;
y += 7;
y = 1 + y << 3;
std::cout << y;
double d = y;
对于结构,除非您选择公开这些操作,否则none are。问题是,你有没有int
,没有限制,或者在某种程度上基于整数值的抽象,并且有自己的约束或不变量?
您应该考虑以下几个方面:
基元类型操作
typedef与struct/class不同,它只是类型的另一个名称,一个别名
因此,如果您选择对基元使用typedef,您将能够执行所有基元类型的操作(如加法、减法等):
Y y = 4;
y+=5;
printf("Y is %d", y);
相反,如果您选择使用struct/class,您将失去所有这些功能,您将不得不自己实现这些运算符。
可维护性和可扩展性
与structs不同,基元类型既不能互补也不能继承
因此,如果您计划从您的类型继承,或者用其他字段来补充它,您应该更喜欢class而不是typedef。
class X : public Y { int x; }
使用typeid
正如我提到的,typedef是该类型的别名
因此,如果您希望您的类型获得与基元类型不同的id,您肯定应该选择struct/class:
typedef int Y;
typeid(Y)==typeid(int)
在这种情况下,表达式将为true。
struct Y { int x; }
typeid(Y)==typeid(int)
在这种情况下,表达式将为false。
在大多数情况下,这并不重要。重要的是,是否需要基于Y
参数重载函数,或者是否希望向Y
添加自定义方法(或覆盖其上的运算符)。typedef
只是一个别名,所以就编译器而言,typedef int Y
只是一个普通的int
,而struct Y
是它自己的不同类型。
- 如何创建 typedef 结构的前向声明
- 无法转发声明C typedef结构-正在查找其他建议
- 如何使用 SWIG 接口访问 python 中的 C++ typedef'd 结构
- 具有未声明/未定义类型的 typedef 结构
- 在 CPP 中初始化 typedef 结构变量
- C++ 无法在 typedef 结构中重载<运算符
- 在 typedef 结构中声明一个数组
- 从 csv 文件中获取不同类型的数据,并将其放入 C++ 中的 typedef 结构中
- 为什么 typedef 结构允许默认初始值设定项?
- 为什么我不能像正常一样初始化 typedef 结构字符串或字符?
- 在Typedef结构中,下划线意味着什么
- 来自 typedef 结构的错误
- 在Typedef结构(C )中超载运算符
- C++中具有对象名称的typedef结构的正向声明
- 为什么Typedef结构会产生链路故障
- 在Typedef结构中定义结构
- 类中typedef结构的奇怪行为
- C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息
- 扩展typedef结构(与VC++11兼容)
- 为什么子类在C++中看不到父类的 typedef 结构?