只有一个成员或只有typedef的结构

时间:2015-02-17 20:21:34

标签: c++ struct typedef

我在编码时声明结构或类,因为它们基于现实世界的对象/想法/概念。

但通常这些结构/类只有一个成员。所以我想知道它是否有任何区别,如果我简单地制作一个typedef。

然后我不确定这是否正确,因为typedef不是'对象'在我看来。

我应该这样做:

struct Y { int x; }

或只是:

typedef int Y;

它有什么不同吗?我的结构图像是对象,typedef是否正确?

3 个答案:

答案 0 :(得分:2)

有很大的不同。使用typedef以下所有内容均有效:

Y y = 14.3;
y += 7;
y = 1 + y << 3;
std::cout << y;
double d = y;

使用struct none,除非您选择公开这些操作。问题是,你有没有限制的int,或者某种基于整数值的抽象,并且有自己的约束或不变量?

答案 1 :(得分:1)

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


原始类型操作

struct / class 不同,

typedef 只是该类型的另一个名称,即别名。
因此,如果您选择对基元使用 typedef ,您将能够执行所有基本类型操作(如加法,减法等):

Y y = 4;
y+=5;
printf("Y is %d", y);

相反,如果你选择使用 struct / 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。

答案 2 :(得分:0)

在大多数情况下,这种方式并不重要。重要的是,如果您需要基于Y参数重载函数,或者您想要将自定义方法添加到(或覆盖运算符)Ytypedef只是一个别名,因此就编译器而言typedef int Y只是一个普通的int,而struct Y是它自己的不同类型。