【问题标题】:'class' keyword in variable definition in C++C ++中变量定义中的'class'关键字
【发布时间】:2015-01-18 04:34:15
【问题描述】:

在有人问之前,是的,这是家庭作业的一部分,是的,我在问之前做了很多谷歌搜索。我花了最后一个小时在 Google 上用很多很多不同的关键字进行了密集搜索,但找不到任何东西。

那么问题来了:

下面的变量定义是什么意思:class MyClass* myClass;?

我用class MyClass* myClass = new MyClass(); 之类的代码尝试了该代码,发现它只是创建了一个指向MyClass 新实例的指针。

那么,使用class 前缀有什么好处呢?有什么区别吗?

有人有相关资源的链接吗?我根本找不到任何东西(除了“类定义”之外,真的很难找到其他东西!)。

非常感谢!

【问题讨论】:

  • 你能提供一些你在哪里看到的上下文吗?它是类中的成员变量吗?在我看来,它可能是前向声明与变量声明的结合。
  • 你几乎永远不需要它。一个模糊的情况是类名被变量或函数隐藏:class MyClass {}; int MyClass; MyClass* myClass = NULL;(不会编译,但您可以添加 class 关键字来引用其他隐藏的名称)。

标签: c++ class variables


【解决方案1】:

详细类型说明符是一个类型名称,前面带有类、结构、枚举或联合关键字。

class identifier 
struct identifier 
enum identifier 
union identifier

详细的类型说明符用于强调或揭示在同一作用域中被同名变量声明所隐藏的类型名称。

source

【讨论】:

  • 加 1 用于提及详细的类型说明符
【解决方案2】:

实际上在创建类对象时使用class 是可选的。在 C 语言中,必须在结构名称前使用 struct 来创建其变量。因为C++是C的超集。C++中struct和class只有一个区别,就是访问修饰符。

为了保持向后兼容,这是允许的。

所以,

class MyClass* myClass = new MyClass();

还有,

MyClass* myClass = new MyClass();

两者都是一样的。

【讨论】:

  • C++几乎是 C 的超集。此外,您的答案最初以过去时态引用 C; C仍然存在,这方面的规则没有改变。
【解决方案3】:

这里需要提一下“内联前向声明”这句话!

前向声明只是一种在实际定义类型名称之前告诉编译器类型名称的方法。你总是在头文件中找到这些。

// MyStruct.h
class MyClass;

struct MyStuct {
   MyClass* m_myClass;
   void foo();
}

// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }

请注意,头文件仅将 MyClass 声明为类标识符,并且在通过 cpp 文件中的#include 定义之前不知道它实际上是什么。这是前向声明。

内联前向声明实际上是一回事,但您只需在一行中完成所有操作。这是实现相同目标的完全相同的代码。

// MyStruct.h
struct MyStuct {
   class MyClass* m_myClass;
   void foo();
}

// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }

我觉得大多数程序员更喜欢标准的前向声明方法(通常总体上更少输入)。这就是为什么在偶然发现较少使用的内联版本时会感到困惑的原因。

我在这里看到很多答案称它为可选关键字,但在上述内联前向声明的上下文中,它非常不可选,并且由于缺少类型说明符而导致编译错误。

【讨论】:

  • C++ 标准不使用术语“前向声明”或“内联前向声明”。标准术语是“声明”和“详细类型说明符”,如本线程其他地方所述。另外,也许你误读了另一个答案,上面写着“实际上,在创建类的对象时使用class是可选的”——为了创建一个对象,类型必须是完整的,并且鉴于类型已经完成,使用class 确实是可选的。
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 2014-03-19
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多