繁体   English   中英

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

[英]'class' keyword in variable definition in C++

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

所以这里有一个问题:

以下变量定义的含义是什么: 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 name前面使用struct来创建其变量。 因为C ++是C的超集。在C ++中,struct和class之间只有一个区别,那就是访问修饰符。

为了保持向后兼容,允许这样做。

所以,

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

我觉得大多数程序员更喜欢标准的前向声明方法(通常整体打字较少)。 这就是为什么当绊倒较少使用的内联版本时它会让人感到困惑。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM