任何人都可以解释“class X x;”实际上是什么意思......在程序中...请给我一些例子吗? 例如:
#include <iostream>
using namespace std;
class X {
public:
X() {}
};
class Y {
public:
Y() {}
};
int main()
{
class X x; //what is this? explain it
class Y y; //what is this? explain it
class Z z; //what is this? explain it //error
return 0;
}
编辑:我可以知道“Z Z z”和“Z z”之间的确切区别。因为虽然 以两种方式编译该程序
class Z Z; //here iam getting as Error: error: incomplete type is not allowed
Z z; //error: identifier "Z" is undefined
因为我问了确切的区别。
答案 0 :(得分:4)
这称为elborated类型说明符,适用于以下情况:
$ 9.1 / 3 - “精心设计的说明符 (7.1.5.3)也可以用作 type-specifier作为a的一部分 宣言。它与班级不同 声明,如果一个类 详细说明的名称在范围内 详细说明的名称将引用它。“
int bad;
class bad{};
int main(){
//bad b;
class bad b; // Elaborated type specifier
}
您现在应该能够理解class Z z
和Z z
之间的区别;
答案 1 :(得分:3)
AFAIK
class X x;
相当于
X x;
(编辑:对于那些挑剔者:至少,在你的情况下,当X是先前定义的类并且在同一范围内没有其他名为X的变量时)。
在普通的C中,只要您定义struct
而没有typedef
,就会在创建变量时明确使用struct
关键字。在C ++中,可以省略struct
关键字,但如果您愿意,也可以编写struct X x;
。由于C ++中class
和struct
之间的唯一区别是默认可见性,因此可以得出结论:class X x;
回答您的修改:
class Z;
是一个前向声明(通常在头文件中使用,您不希望#include "Z.hpp"
)。这也称为不完整类型声明。它允许声明指针到Z,例如
class Z *z;
是合法代码,即使编译器没有看到Z的任何类主体声明。不允许的是只要Z从编译器的视图中不完整就创建z的实例,如class Z z;
。< / p>
但是代码Z z;
不能被解释为编译器的前向声明(甚至不能作为不允许的前向声明)。它只是显示为“Z未定义”。
答案 2 :(得分:3)
C ++最初是C的扩展。
在C类中,名称不是完整的类型名称。所以在C中,如果你写
struct Blah
{
int x;
};
然后声明这个类的变量,在C中你必须写
struct Blah myBlahObject;
在C ++中,类名是一个完整的类型名,所以你可以写
Blah myBlahObject;
但主要是为了与C兼容,C ++保留了C风格的声明语法,并将其概括为也适用于C ++ class
关键字。
这意味着在C ++中你可以写例如。
class NeverSeenBefore* p;
声明类型为p
的指针变量NeverSeenBefore*
。尚未在任何地方声明NeverSeenBefore
的地方。它只是一个不完整类型,使用class
(或struct
)关键字通知编译器,如在C中,有这样的类型,即使它不是尚未宣布。
C ++有一个内置的不完整类型,称为void
- 如果你试图声明一个void
变量,你会得到同样的错误信息(来自一个好的编译器)。
void
与其他不完整类型之间的主要区别在于void
无法完成。
顺便说一下,获取完整的类型名称的C技术是使用typedef
。由于类名是C ++中完全成熟的类型名,因此在C ++中不需要typedef
。所以,当你看到C ++代码为{em>提供typedef
代替而只是命名类时,那么你知道C程序员已经在那里 - 或者是一个人教C程序员(或递归地,由C程序员教授的人教授,等等)。
干杯&amp;第h。,
答案 3 :(得分:1)
class X x;
在名为class X
的堆栈上实例化x
类型的对象。看看你对X
的定义,没有方法或字段,所以你真的不能用它做很多事。
你知道c ++中有哪些类吗?
答案 4 :(得分:0)
声明类的实例时,class
关键字是可选的。
答案 5 :(得分:0)
根据您的新编辑,
class Z z;
当编译器遇到此问题时,它会指出Z
是您指定的类。但它无法找到class Z
的声明。因此它显示error: incomplete type is not allowed
。
现在,当编译器遇到Z z;
时,它不知道Z
是什么,因为你没有在任何地方指定它。所以报告error: identifier "Z" is undefined
。