是否可以在C ++中使用匿名类?

时间:2017-05-25 06:29:19

标签: c++ class c++11 g++ c++14

我在Quora上的C++代码中看到了匿名类。它已经成功编译并运行。

此处的代码:

#include <iostream>

auto func()
{
    class // no name
    {
      public:
             int val;
    } a;

    a.val = 5;

    return a;
}

int main()
{
    std::cout << func().val << std::endl;
    return 0;
}

那么,在C ++中有效吗?

另外,我很想知道,是否可以在C ++中使用匿名类?

3 个答案:

答案 0 :(得分:31)

不仅如此,您还可以使用decltype创建更多类的实例。

#include <iostream>

class 
{
   public:
      int val;
} a;


int main()
{
   decltype(a) b;
   a.val = 10;
   b.val = 20;

   std::cout << a.val << std::endl;
   std::cout << b.val << std::endl;
   return 0;
}

输出:

10
20

答案 1 :(得分:18)

在C ++中,匿名联合是这种形式的联合:

 union { ... } ;

它定义了一个未命名类型的未命名对象。它的成员被注入到周围的范围内,因此可以在不使用<object>.前缀的情况下引用它们。否则将是必要的。

从这个意义上说,不存在匿名类(不是工会---在C ++联合中是类)。

另一方面,未命名的类(包括结构和联合)并不罕见。

union { ... } x;
class { ... } y;
typedef struct { ... } z;

xy是未命名类型的命名对象。 z是一个typedef-name,它是未命名结构的别名。它们不是匿名的,因为这个术语是为上述形式的联合保留的。

[](){}

Lambdas是未命名类类型的未命名对象,但它们也不是匿名的。

答案 2 :(得分:9)

总是可以这样写:

struct { int a }

现在,如果你看一下--name部分,这是一个匿名结构。在C ++中,结构和类之间基本没有区别(默认访问修饰符除外)。因此,可以使用匿名结构/类。