闭合类括号后面的名称是什么意思?

13
我遇到了这个代码示例,我记得之前看到过它,但不知道它的作用和功能是什么?我在互联网上搜索了一下,但没有找到相关信息。
代码:
class C
{
    int x; // a non-static variable, implicitly private

public:
    C() : x(0) {} // default constructor

    // a static member function, which uses a non-static variable perfectly well
    static int Incr(C& instance) { return ++(instance.x); }
} g_c;

int main(void)
{
    C c2;
    return C::Incr(g_c) + C::Incr(c2);
}

最后一个类括号后的g_c是什么意思?
4个回答

22
} g_c;

这里声明了一个名为g_c的对象,其类型为C类。

这种构造方式使您能够创建未命名类型的对象,例如:

class  //Nameless class!
{
   //data members

}obj1, obj2;

在这个例子中,obj1obj2被声明为一个没有名称的类类型的对象——这个类是无名的!在这种情况下,你不能以传统的方式声明对象(即 Type obj1, obj2; 的方式)。因此,这个构造帮助你做到了这一点。
甚至可以从其他有名称的类派生出来,同时保持无名状态(并声明无名类的对象):
class : public A, public B //Nameless class is deriving from A and B
{
   //data members

}obj1, obj2;

简而言之,这个结构确保用户不能创建比预期更多的对象,除非一些恶意程序员使用/滥用/误用C++11(或模板)如下:
decltype(obj1) obj3; //hehe!

希望这能帮到您!

1
谢谢你分享额外的知识。我不知道你可以这样做。 - SLC

14

这是一个简写,意思是:

class C
{
    ....
};

C g_c;

所以这就像是在定义类之后将其实例化为 g_c,而 g_c 就像任何普通的类实例一样? - SLC

2
您可以使用格式类型 变量名;来声明变量。例如:
A x;

其中A可能是一个类的名称。

但是,除了使用现有的类类型外,您还可以在声明新类类型的变量的同时定义该类:

class { ... } x;

或者定义一个类并给它命名:
class A { ... } x;

在C++中,通常只需定义类并为其命名,但不需要变量:
class A { ... };

但是您不必省略变量。

阅读时,“它”这个词很令人困惑。我认为它指的是这个变量。 - user230910

1
那只是创建该类对象的一种方式。结构体通常使用它们来初始化新变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接