下面的变量定义是什么意思?
class MyClass* myClass;
我尝试运行代码
class MyClass* myClass = new MyClass();
,发现它只是创建了一个指向MyClass
的新实例的指针。
这里使用
class
前缀的目的是什么?有什么区别吗?
详细类型说明符是前面带有 class、struct、enum 或 union 关键字的类型名称。
class identifier
struct identifier
enum identifier
union identifier
详细的类型说明符用于强调,或显示被同一范围内具有相同名称的变量声明所隐藏的类型名称。
实际上,在创建类对象时可以选择使用
class
。在 C 语言中,必须在结构名称前面使用 struct
来创建其变量。由于 C++ 是 C 的超集。C++ 中的结构体和类之间只有一个区别,那就是访问修饰符。
为了保持向后兼容,这是允许的。
那么,
class MyClass* myClass = new MyClass();
还有,
MyClass* myClass = new MyClass();
两者是一样的。
这里需要提一下“内联前向声明”这个词!
前向声明只是一种在实际定义之前告诉编译器类型名称的方法。您始终可以在头文件中找到这些内容。
// 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(); }
我觉得大多数程序员更喜欢标准的前向声明方法(通常总体上打字较少)。这就是为什么当偶然发现较少使用的内联版本时可能会感到困惑。
我在这里看到许多答案将其称为可选关键字,但在上述内联前向声明的上下文中,它非常不可选,并且会由于缺少类型说明符而导致编译错误。