我看到了这个构造函数:
MyClass(class MyOtherClass* = 0) {}
< p >“class”关键字是什么意思?构造函数接受一个“MyOtherClass”指针并将参数默认为空指针吗?
MyClass(class MyOtherClass* = 0) {}
< p >“class”关键字是什么意思?构造函数接受一个“MyOtherClass”指针并将参数默认为空指针吗?
这是一个前向声明。在这种情况下,不需要先定义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
};
MyOtherClass
,因为所需的只是指向它的指针。前向声明告诉编译器有关 MyOtherClass
的所有信息,以便生成指向它的指针。 - John Diblingstd::string
就是这种类型之一。即使它不是模板实例化的 typedef,你也不能将 任何 东西前向声明到命名空间 std
中。但重点是,除非通过 class Foo { ... };
定义 Foo
,否则无法前向声明 class Foo;
。在我看来,从其他人的模块中前向声明类型是一种不可接受的抽象泄漏,但你的看法可能不同。 - Steve Jessop
struct tm*
,不是吗? - Matthieu M.