'class' C++ 变量定义中的关键字
'class' keyword in variable definition in C++
在有人问之前,是的,这是作业的一部分,是的,我在问之前做了很多谷歌搜索。我花了最后一个小时在 Google 上用很多很多不同的关键词进行了密集搜索,但就是找不到任何东西。
问题来了:
What does the following variable definition mean: class MyClass* myClass;
?
我用 class MyClass* myClass = new MyClass();
之类的代码尝试了该代码,发现它只是创建了一个指向 MyClass
.
的新实例的指针
那么,使用 class
前缀有什么好处呢?这有什么区别吗?
有人 link 有关于它的一些资源吗?我根本找不到任何东西(真的很难找到 "class definition" 以外的东西!)。
非常感谢!
实际上在创建 class 的对象时使用 class
是可选的。在 C 语言中,必须在结构名称前使用 struct
来创建其变量。由于C++是C的超集。C++中的struct和class只有一个区别,那就是访问修饰符。
为了保持向后兼容,这是允许的。
所以,
class MyClass* myClass = new MyClass();
而且,
MyClass* myClass = new MyClass();
两者相同。
详细类型说明符是一个类型名称,前面有 class、struct、enum 或 union 关键字。
class identifier
struct identifier
enum identifier
union identifier
详尽的类型说明符用于强调,或揭示被同一作用域中具有相同名称的变量声明所隐藏的类型名称。
这里需要提到"inline forward declaration"这几个字!
前向声明只是一种在实际定义类型名称之前告知编译器类型名称的方法。你总是在头文件中找到这些。
// MyStruct.h
class MyClass;
struct MyStuct {
MyClass* m_myClass;
void foo();
}
// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }
请注意,头文件仅将 MyClass 声明为 class 标识符,并且在通过 cpp 文件中的 #include 定义之前不知道它实际上是什么。这是前向声明。
内联前向声明实际上是一回事,但您只需在一行中完成所有操作。这是实现相同功能的完全相同的代码。
// MyStruct.h
struct MyStuct {
class MyClass* m_myClass;
void foo();
}
// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }
我觉得大多数程序员更喜欢标准的前向声明方法(通常总体上输入更少)。这就是为什么在偶然发现较少使用的内联版本时会感到困惑的原因。
我在这里看到很多答案称它为可选关键字,但在上述内联前向声明的上下文中,它非常不是可选的,并且会由于缺少类型说明符而导致编译错误。
在有人问之前,是的,这是作业的一部分,是的,我在问之前做了很多谷歌搜索。我花了最后一个小时在 Google 上用很多很多不同的关键词进行了密集搜索,但就是找不到任何东西。
问题来了:
What does the following variable definition mean:
class MyClass* myClass;
?
我用 class MyClass* myClass = new MyClass();
之类的代码尝试了该代码,发现它只是创建了一个指向 MyClass
.
那么,使用 class
前缀有什么好处呢?这有什么区别吗?
有人 link 有关于它的一些资源吗?我根本找不到任何东西(真的很难找到 "class definition" 以外的东西!)。
非常感谢!
实际上在创建 class 的对象时使用 class
是可选的。在 C 语言中,必须在结构名称前使用 struct
来创建其变量。由于C++是C的超集。C++中的struct和class只有一个区别,那就是访问修饰符。
为了保持向后兼容,这是允许的。
所以,
class MyClass* myClass = new MyClass();
而且,
MyClass* myClass = new MyClass();
两者相同。
详细类型说明符是一个类型名称,前面有 class、struct、enum 或 union 关键字。
class identifier
struct identifier
enum identifier
union identifier
详尽的类型说明符用于强调,或揭示被同一作用域中具有相同名称的变量声明所隐藏的类型名称。
这里需要提到"inline forward declaration"这几个字!
前向声明只是一种在实际定义类型名称之前告知编译器类型名称的方法。你总是在头文件中找到这些。
// MyStruct.h
class MyClass;
struct MyStuct {
MyClass* m_myClass;
void foo();
}
// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }
请注意,头文件仅将 MyClass 声明为 class 标识符,并且在通过 cpp 文件中的 #include 定义之前不知道它实际上是什么。这是前向声明。
内联前向声明实际上是一回事,但您只需在一行中完成所有操作。这是实现相同功能的完全相同的代码。
// MyStruct.h
struct MyStuct {
class MyClass* m_myClass;
void foo();
}
// MyStruct.cpp
#inlude "MyClass.h"
void MyStruct::foo() { m_myClass->SomeFunc(); }
我觉得大多数程序员更喜欢标准的前向声明方法(通常总体上输入更少)。这就是为什么在偶然发现较少使用的内联版本时会感到困惑的原因。
我在这里看到很多答案称它为可选关键字,但在上述内联前向声明的上下文中,它非常不是可选的,并且会由于缺少类型说明符而导致编译错误。