可能重复:
Difference between ‘struct’ and ‘typedef struct’ in C++?
对this question的回答让我对以下内容感到疑惑:
我认为定义一个类如下:
typedef class {int i;} C;
完全等同于以传统方式定义它:
class C
{
int i;
};
这种推定是否正确?
答案 0 :(得分:4)
在这个孤立的例子中,它们在功能上是相同的,至少从外面看。
然而,存在差异。特别是一个实例,您不能声明以这种方式声明的struct
或class
的构造函数,只是因为class
未命名。同样,您不能声明任何涉及类名称的函数。以下是一些例子:
typedef class
{
public:
Gizmo() : n_(42) {}; // NOT OK
~Gizmo();
Gizmo& operator<<(int n);
private:
int n_;
} Gizmo;
您也无法转发声明匿名类:
class Gizmo;
在C ++中,我从未见过typedef
匿名struct
或class
比仅仅声明class
或struct
更优先的情况这是命名的。在某些情况下,传统方法绝对是首选。这个故事的寓意是:不要在C ++中使用typedef class {} Name;
。它什么都买不到,给你带来了一些成本。
答案 1 :(得分:2)
从实际的角度来看是的,因为标准说(9.1 / 5)
7.1 / 3说:命名类类型或其cv限定版本的typedef-name(7.1.3)也是>一个类名。如果在a中使用了命名cv限定类类型的typedef-name class-name是必需的,cv限定符被忽略。
使用typedef说明符声明的名称将成为typedef-name。 在其声明的范围内,typedef-name是语法上的 相当于一个关键字,并命名与该关联的类型 标识符以第8章中描述的方式描述。因此,typedef-name是a 另一种类型的同义词。
从理论的角度来看,因为你可以(实际上我已经看到人们已经有)草稿程序有效或无效,取决于使用的是哪个版本,因为7.1 / 3继续从我切断的地方说:< / p>
typedef-name可以 不要像类声明(9.1)或枚举声明那样引入新类型。
答案 2 :(得分:2)
我认为这是一个重复的问题(找不到),但如果没有,请注意这个编译:
class C
{
int i;
};
void C() {}
class C x;
虽然这不会:
typedef class
{
int i;
} C;
void C() {}
C x;
名称空间不同。
答案 3 :(得分:0)
他们并不等同。特别是,
int main()
{
class C c;
}
只会编译两个定义中的一个。
答案 4 :(得分:0)
这是另一个区别:后者可以是前向声明的,前者不能。