将typedef和匿名类定义用于传统类定义的等效性

时间:2012-10-30 12:43:39

标签: c++ typedef anonymous-class

  

可能重复:
  Difference between ‘struct’ and ‘typedef struct’ in C++?

this question的回答让我对以下内容感到疑惑:

我认为定义一个类如下:

typedef class {int i;} C;

完全等同于以传统方式定义它:

class C
{
   int i;
};

这种推定是否正确?

5 个答案:

答案 0 :(得分:4)

在这个孤立的例子中,它们在功能上是相同的,至少从外面看。

然而,存在差异。特别是一个实例,您不能声明以这种方式声明的structclass的构造函数,只是因为class未命名。同样,您不能声明任何涉及类名称的函数。以下是一些例子:

typedef class
{
public:
  Gizmo() : n_(42) {}; // NOT OK
  ~Gizmo();
  Gizmo& operator<<(int n);    
private:
  int n_;
} Gizmo;

您也无法转发声明匿名类:

class Gizmo;

在C ++中,我从未见过typedef匿名structclass比仅仅声明classstruct更优先的情况这是命名的。在某些情况下,传统方法绝对是首选。这个故事的寓意是:不要在C ++中使用typedef class {} Name;。它什么都买不到,给你带来了一些成本。

答案 1 :(得分:2)

从实际的角度来看是的,因为标准说(9.1 / 5)

  

命名类类型或其cv限定版本的typedef-name(7.1.3)也是>一个类名。如果在a中使用了命名cv限定类类型的typedef-name   class-name是必需的,cv限定符被忽略。

7.1 / 3说:

  

使用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)

这是另一个区别:后者可以是前向声明的,前者不能。