在阅读有关 pImpl 习语的一些东西时,我发现了这样的内容:
MyClass::MyClass() : pimpl_( new MyClassImp() )
第一:什么意思?
第二:语法是什么?
很抱歉成为这样的菜鸟。
在阅读有关 pImpl 习语的一些东西时,我发现了这样的内容:
MyClass::MyClass() : pimpl_( new MyClassImp() )
第一:什么意思?
第二:语法是什么?
很抱歉成为这样的菜鸟。
这定义了MyClass
.
语法是具有初始化列表的构造函数定义的语法(我假设在此之后有一组大括号定义构造函数的主体)。
pimpl_
的成员MyClass
被初始化为指向新类型对象的指针MyClassImp
。它与以下内容几乎相同:
MyClass::MyClass()
{
pimpl_ = new MyClassImp();
}
但是,最好尽可能使用初始化列表来初始化类成员;请参阅上面链接的 C++ FAQ Lite 条目。
这是一个初始化列表。它允许您在调用构造函数代码之前设置成员和基类构造函数的值。
您应该使用它来初始化您的类实例的值。
除了作为其他人已经解释过的具有初始化列表的构造函数之外,它还使用私有实现模式。
C++ 要求类声明包含类的所有公共和私有成员。这可能导致您不得不公开您不想公开的实现细节,并使您的实现成为 API/ABI 的一部分。它还可以显着增加编译时间,因为公共头文件中的额外#includes 以支持私有成员变量。
使用实际实现创建第二个类并仅公开功能性 API 会使这更加简洁,但代价是额外的间接层。
C 通常通过指向库为您创建和销毁的不透明对象的指针来处理此问题。