在构造函数中,“class”是什么意思?

5
我看到了这个构造函数:
MyClass(class MyOtherClass* = 0) {}
< p >“class”关键字是什么意思?构造函数接受一个“MyOtherClass”指针并将参数默认为空指针吗?

哇!我从未见过这样的语法,很有趣,加一。 - Kiril Kirov
1
@KirilKirov:但是你确实看到了 struct tm*,不是吗? - Matthieu M.
@MatthieuM. - 当然。我在写这个评论的时候也是这么想的 :) - Kiril Kirov
1个回答

10

这是一个前向声明。在这种情况下,不需要先定义MyOtherClass就可以使用,因此前向声明足够了。 =0 是参数的默认值。

以下是您不需要完整定义的情况:

  • 成员指针
  • 成员引用
  • 方法参数类型
  • 方法返回类型

请比较以下内容:

//MyClass.h
class MyClass
{
    MyClass(MyOtherClass* = 0) {} //doesn't compile
                                  //doesn't know what MyOtherClass is
};

//MyClass.h
class MyClass
{
    MyClass(class MyOtherClass* = 0) {} //compiles, MyOtherClass is declared
};

//MyClass.h
class MyOtherClass;   //declare MyOtherClass
class MyClass
{
    MyClass(MyOtherClass* = 0) {} //compiles, declaration available
};

1
只是一个澄清的观点。这里不必完全定义 MyOtherClass,因为所需的只是指向它的指针。前向声明告诉编译器有关 MyOtherClass 的所有信息,以便生成指向它的指针。 - John Dibling
1
@Andreas:因为你想要最小化你的包含。 - user784668
@Andreas 请查看 https://dev59.com/2Wkw5IYBdhLWcg3waZ74#9906429 - Luchian Grigore
1
在编程中,使用前向声明而不是包含适当的头文件时,通常会遇到一个问题,即类型可能无法轻松地进行前向声明。例如,std::string 就是这种类型之一。即使它不是模板实例化的 typedef,你也不能将 任何 东西前向声明到命名空间 std 中。但重点是,除非通过 class Foo { ... }; 定义 Foo,否则无法前向声明 class Foo;。在我看来,从其他人的模块中前向声明类型是一种不可接受的抽象泄漏,但你的看法可能不同。 - Steve Jessop
@Luchain:嗯,在那个其他问题的anatolyg的答案中已经有一个例子了,其中前向声明是有效的,但构成了重要的代码重复。 - Steve Jessop
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接