首页 > 解决方案 > 为什么要在类对象的声明中写一个“类”?

问题描述

我通常不这样写,但我见过一个几乎无处不在的代码库,例如:

class prettyClass
{
    // just class stuff
};

int main()
{
    class prettyClass obj; // class?
    return 0;
}

标签: c++oop

解决方案


在 C 中,结构的标签与其他标识符位于不同的命名空间中。因此,除非引入别名,否则他们必须struct T为类型名称编写。在 C++ 中(其中classstruct具有相同的基本概念),它被制作为自动将标记作为常规标识符引入。

但是,必须考虑 C 中的一种行为。你可以有这样的东西:

struct prettyThing
{
  // data
};

void prettyThing();

由于命名空间不同,因此没有歧义。所以 C++ 保留了这种行为。还可以有:

class prettyThing
{
   // members
};

void prettyThing();

没有歧义,类名被另一个标识符隐藏。它只能通过详细的类型说明符访问,即class prettyThing. 这就是为什么人们可以编写如您所见的声明的一个实际原因。这不是学术性的,考虑一下 POSIXstatstruct statpair

但是......除非您正在与最初以 C 概念编写的 C 代码交互,否则没有理由以这种方式编写新的 C++ 代码。

有人可能想知道为什么它对于声明的类型不保持相同,struct而对于声明的类型则不允许class。要理解这一点,最好重申并记住classes 和structures 在 C++ 中实际上是相同的东西(默认访问说明符除外)。以下是所有有效的 C++:

struct thing1; // forward declare

class thing1 {
  // define
};

struct thing2 {
   // define
};

class thing2 object;

任一关键字都可以在详细类型说明符中使用,它们在标准 C++ 1中是完全可互换的。


1 -不过,Microsoft ABI 在这里表现得有点奇怪


推荐阅读