C++ 变量定义中的“class”关键字

问题描述 投票:0回答:3

下面的变量定义是什么意思?

class MyClass* myClass;

我尝试运行代码

class MyClass* myClass = new MyClass();
,发现它只是创建了一个指向
MyClass
的新实例的指针。

这里使用

class
前缀的目的是什么?有什么区别吗?

c++ class variables
3个回答
26
投票

详细类型说明符是前面带有 class、struct、enum 或 union 关键字的类型名称。

class identifier 
struct identifier 
enum identifier 
union identifier

详细的类型说明符用于强调,或显示被同一范围内具有相同名称的变量声明所隐藏的类型名称。

来源


16
投票

实际上,在创建类对象时可以选择使用

class
。在 C 语言中,必须在结构名称前面使用
struct
来创建其变量。由于 C++ 是 C 的超集。C++ 中的结构体和类之间只有一个区别,那就是访问修饰符。

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

那么,

class MyClass* myClass = new MyClass();

还有,

MyClass* myClass = new MyClass();

两者是一样的。


12
投票

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

前向声明只是一种在实际定义之前告诉编译器类型名称的方法。您始终可以在头文件中找到这些内容。

// 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(); }

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

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

© www.soinside.com 2019 - 2024. All rights reserved.