我在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 ++中使用匿名类?
答案 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;
x
和y
是未命名类型的命名对象。 z
是一个typedef-name,它是未命名结构的别名。它们不是匿名的,因为这个术语是为上述形式的联合保留的。
[](){}
Lambdas是未命名类类型的未命名对象,但它们也不是匿名的。
答案 2 :(得分:9)
总是可以这样写:
struct { int a }
现在,如果你看一下--name
部分,这是一个匿名结构。在C ++中,结构和类之间基本没有区别(默认访问修饰符除外)。因此,可以使用匿名结构/类。