C ++语法问题,使用class关键字

时间:2010-11-19 06:30:19

标签: c++

任何人都可以解释“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

因为我问了确切的区别。

6 个答案:

答案 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 zZ z之间的区别;

答案 1 :(得分:3)

AFAIK

class X x;

相当于

X x;

编辑:对于那些挑剔者:至少,在你的情况下,当X是先前定义的类并且在同一范围内没有其他名为X的变量时)。

在普通的C中,只要您定义struct而没有typedef,就会在创建变量时明确使用struct关键字。在C ++中,可以省略struct关键字,但如果您愿意,也可以编写struct X x;。由于C ++中classstruct之间的唯一区别是默认可见性,因此可以得出结论: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