Arm*_*yan 4 c++ struct class declaration
但我当然不应该想到做这些事情,我知道,但这仍然很有趣:
class A; //declaration
struct A {...}; //definition
struct B; //declaration
class B {...}; //definition
Run Code Online (Sandbox Code Playgroud)
当我想到它时,如果真的允许这样的话,我没有看到任何问题(因为struct和class本质上是相同的).但它(标准)?
MSVC接受并编译它,并发出警告.
根据标准允许它,但正如一些编译器警告它,它不是很有用.
我相信这个警告是由MSVC使用不同的名称修改结构和类引起的,这会使它更不实用......
应@Armen的要求:
7.1.5.3详细说明的类型说明符,p3
...在任何详细类型说明符中,
enum
关键字应用于表示枚举(7.2),union
类密钥用于表示联合(第9条),class
或者struct
类密钥应使用用于引用使用class
orstruct
class-key声明的类(第9节).
根据C++ 03标准9.1 - 2
"类定义将类名引入定义它的作用域中,并在封闭作用域(3.3)中隐藏该名称的任何类,对象,函数或其他声明."
因此它符合标准.
使用示例代码玩一下:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
prog.cpp: In function ‘int main()’:
prog.cpp:6: error: ‘int B::j’ is private
prog.cpp:13: error: within this context
Run Code Online (Sandbox Code Playgroud)
C++ struct和class之间的唯一区别是结构的默认访问说明符是公共的,而对于类是私有的.
因此,从上面的例子:
在这种情况下,编译器将其A
视为structure
&
B
作为class
如您所见,编译器遵循标准中的引用,并且具有定义的类型是编译器在声明类型上识别的内容.
归档时间: |
|
查看次数: |
170 次 |
最近记录: |