0

在阅读有关 pImpl 习语的一些东西时,我发现了这样的内容:

MyClass::MyClass() : pimpl_( new MyClassImp() )

第一:什么意思?
第二:语法是什么?
很抱歉成为这样的菜鸟。

4

3 回答 3

8

这定义了MyClass.

语法是具有初始化列表的构造函数定义的语法(我假设在此之后有一组大括号定义构造函数的主体)。

pimpl_的成员MyClass被初始化为指向新类型对象的指针MyClassImp。它与以下内容几乎相同:

MyClass::MyClass()
{
    pimpl_ = new MyClassImp();
}

但是,最好尽可能使用初始化列表来初始化类成员;请参阅上面链接的 C++ FAQ Lite 条目。

于 2009-11-22T20:10:26.853 回答
2

这是一个初始化列表。它允许您在调用构造函数代码之前设置成员和基类构造函数的值。

您应该使用它来初始化您的类实例的值。

于 2009-11-22T20:10:31.220 回答
0

除了作为其他人已经解释过的具有初始化列表的构造函数之外,它还使用私有实现模式。

C++ 要求类声明包含类的所有公共和私有成员。这可能导致您不得不公开您不想公开的实现细节,并使您的实现成为 API/ABI 的一部分。它还可以显着增加编译时间,因为公共头文件中的额外#includes 以支持私有成员变量。

使用实际实现创建第二个类并仅公开功能性 API 会使这更加简洁,但代价是额外的间接层。

C 通常通过指向库为您创建和销毁的不透明对象的指针来处理此问题。

于 2009-11-23T05:39:53.510 回答