具有一个成员或仅typedef的结构

Struct with one member or just typedef

本文关键字:typedef 结构 有一个 成员 具有一      更新时间:2023-10-16

在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,没有限制,或者在某种程度上基于整数值的抽象,并且有自己的约束或不变量?

您应该考虑以下几个方面:


基元类型操作

typedefstruct/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是它自己的不同类型。