【问题标题】:Why write a "class" in the declaration of a class object?为什么要在类对象的声明中写一个“类”?
【发布时间】:2021-06-25 11:07:42
【问题描述】:

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

class prettyClass
{
    // just class stuff
};

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

【问题讨论】:

  • 写 C 的内在创伤?
  • 出于多种原因允许使用它,但大多数时候不需要它,因此它是多余的但无害的。为什么作者选择做一些多余但无害的事情?你的猜测和我的一样好。

标签: c++ oop


【解决方案1】:

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

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

struct prettyThing
{
  // data
};

void prettyThing();

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

class prettyThing
{
   // members
};

void prettyThing();

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

但是...除非您正在与最初以 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 behaves as a bit of an oddball here, though.

【讨论】:

  • “在 C++ 中(类和结构相同)”Structclass 几乎相同。默认成员可见性不同:-)
  • @A.Ocannaille - 如果你想进入这样的迂腐,那么可见性是错误的词。所有成员始终可见,访问检查是单独的最后一步。这是许多问题的主题。例如:stackoverflow.com/q/1201295/817643
  • 确实,可见性并不是一个完美的术语。然而,如果必须用一个词来定义类和结构之间的区别,那么恕我直言,这是最好的。 OP 似乎是一个初学者,声明“classstruct 相同”是错误的,同时将可见性定义为 classstruct 之间的区别只是简化。恕我直言,对于未来的读者,值得编辑。谢谢你的顺便说一句=)
  • @A.Ocannaille - 我们必须同意不同意。人们认为结构在类型系统中有自己的类别,但实际上没有。 “不完美”这个词的危害远比让一个人的期望落空的句子大得多。
猜你喜欢
  • 2011-09-08
  • 2020-01-22
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2012-05-06
  • 2012-08-31
  • 2011-05-19
相关资源
最近更新 更多