“Typedef声明”和“类声明”之间的区别

时间:2011-11-01 17:10:24

标签: c++ class typedef

问题非常简单。为了进一步澄清,下面的代码中Foo1Foo2之间的区别在于它们的声明方式(例如,一个使用class Foo1 { ... };而另一个使用typedef class { ... } Foo2; })?

class Foo1 {
public:
    void bar() { }
};

typedef class {
public:
    void bar() { }
} Foo2;

int main()
{
    Foo1 f1;
    f1.bar();
    Foo2 f2;
    f2.bar();
    return 0;
}

2 个答案:

答案 0 :(得分:6)

差异很微妙。在第一种情况下,您要创建名为Foo1的类,而在第二种情况下,您要创建一个匿名类,并使用typedef提供别名Foo2

第三种选择是:

typedef class Foo3 {
public:
   void bar() {}
} Foo3;

这将创建一个名为Foo3 的类,创建一个别名Foo3来引用它。

细微之处在于如何用语言处理标识符。当代码中存在标识符时,编译器将执行查找以知道它意味着什么。查找将检查每个范围,首先在全局标识符空间中定义大多数符号(不包括用户定义的类型),如果它无法在那里找到标识符,那么它将在中查找用户定义的标识符空间。用户定义的类型属于第二个标识符空间,而typedef - ed名称存在于第一个组中。只有当两个查找都失败时,编译器才会转到下一个封闭范围。

提供一个简单的测试用例,其中差异是值得注意的:

class A {};
typedef class {} B;
typedef class C {} C;
void A();              // correct: no collision
//void B();            // error, identifier B already used with a different meaning!
//void C();            //   "
namespace test {
   void B();
   void C();
   void f() {
      class A a;       // creates variable of type ::A
      A();             // calls function ::A
      B();             // calls function test::B()
      //class B b;     // error: B does not denote a user-defined type name
      C();             // calls function test::C()
      class C c;       // creates variable of type ::C
   }
}

答案 1 :(得分:-1)

我认为第二个对C来说是必要的,但对于C ++来说真的没必要。在内部我相信第二个是创建一个未命名的类,然后为它创建一个typedef,而第一个只是创建类。

我认为c ++库中不需要typedef样式类声明。