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

时间:2015-01-18 04:34:16

标签: c++ class variables

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

所以这就是问题所在:

  

以下变量定义的含义是什么:class MyClass* myClass;

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

那么,使用class前缀的优势是什么?这有什么不同吗?

有人有关于它的某些资源的链接吗?我根本找不到任何东西(真的很难找到除了#34;类定义"以外的东西。)。

非常感谢!

3 个答案:

答案 0 :(得分:15)

详细的类型说明符是一个类型名称,前面是class,struct,enum或union关键字。

class identifier 
struct identifier 
enum identifier 
union identifier

精心设计的类型说明符用于强调,或显示由同一范围内具有相同名称的变量声明隐藏的类型名称。

source

答案 1 :(得分:9)

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

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

所以,

class MyClass* myClass = new MyClass();

MyClass* myClass = new MyClass();

两者都是一样的。

答案 2 :(得分: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(); }

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

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