用struct关键字声明一个类,反之亦然

时间:2011-06-26 17:12:40

标签: c++ class struct declaration

但我当然不应该想到做这些事情,我知道,但这仍然很有趣:

class A; //declaration
struct A {...}; //definition

struct B; //declaration
class B {...}; //definition

当我考虑它时,如果真的允许这样的话,我没有看到任何问题(因为struct和class本质上是相同的)。但它(标准)?

MSVC接受并编译它,并发出警告。

2 个答案:

答案 0 :(得分:8)

根据标准允许这样做,但正如一些编制者所警告的那样,它不是很有用。

我相信这个警告是由MSVC使用不同的名称修改结构和类引起的,这会使它更不实用......


根据@Armen的要求:

7.1.5.3详细说明的类型说明符,p3

  

...在任何 elaborated-type-specifier 中,enum关键字应用于引用枚举(7.2),union 类-key 应用于引用联合(第9条),并且classstruct class-key 应用于指代class(第9条),使用classstruct class-key 声明。

答案 1 :(得分:5)

根据 C ++ 03标准9.1 - 2

“类定义将类名引入定义它的范围,并在封闭范围内隐藏该名称的任何类,对象,函数或其他声明(3.3)。” < / p>

因此按照标准有效。

使用示例代码:

#include<iostream>

class A; //declaration 
struct A { int i;}; //definition  
struct B; //declaration 
class B {int j;}; //definition 

int main()
{
    A obj;
    obj.i = 10;
    B obj2;
    obj2.j = 10;
    std::cout<<"sizeof"<<sizeof(struct B);
    return 0;
}

这是输出:

prog.cpp: In function ‘int main()’:
prog.cpp:6: error: ‘int B::j’ is private
prog.cpp:13: error: within this context

C ++ struct&amp; amp; class是结构的默认访问说明符是public,而class是私有的。

所以,从上面的例子来看:
在这种情况下,编译器会将A视为structure&amp;
B class

如您所见,编译器遵循标准中的引用,并且具有定义的类型是编译器在声明类型上识别的内容。