C++ 在c++;?
我有一个x.cpp文件,其中我看到一个类在名称空间中定义。所以,我的问题是: 1) 在名称空间内定义类的优点是什么? 2) 其次,在同一个x.cpp文件中,我还看到在名称空间之外定义的结构。那么,在同一个x.cpp文件中这样做有什么好处呢 x、 h的形状如下所示:C++ 在c++;?,c++,namespaces,C++,Namespaces,我有一个x.cpp文件,其中我看到一个类在名称空间中定义。所以,我的问题是: 1) 在名称空间内定义类的优点是什么? 2) 其次,在同一个x.cpp文件中,我还看到在名称空间之外定义的结构。那么,在同一个x.cpp文件中这样做有什么好处呢 x、 h的形状如下所示: class x{ private: struct abc; }; 而x.cpp看起来是: namespace{ class{}; } struct x:abc{}; 匿名命名空间只能在其编译单元内访问。
class x{
private:
struct abc;
};
而x.cpp看起来是:
namespace{
class{};
}
struct x:abc{};
匿名命名空间只能在其编译单元内访问。这意味着没有其他cpp可以访问
x.cpp
的匿名命名空间中的任何内容
namespace {
class abc {}; // this class is visible only within x.cpp
// no other separately compiled cpp can't see it.
}
struct x : abc{}; // the struct (class) x inherits from abc.
优点是它使实现真正私有化。只有通过继承自abc
的x
才能访问abc
namespace {
class abc {}; // this class is visible only within x.cpp
// no other separately compiled cpp can't see it.
}
struct x : abc{}; // the struct (class) x inherits from abc.
这使得它真正不同于私有成员,甚至不同于私有继承。由于在其他编译单元中不能绝对不引用abc
,因此只能使用x
的正向声明。因此,x注定要在x.cpp
之外保持一个不完整的类型
事实上,这种方法是实现完美PIMPL的第一步。这演示了一个使用匿名名称空间实现PIMPL习惯用法的完整示例 好的,第一部分很清楚,x不是由abc继承的,它的语法如下:struct x::abc{};那么,这样做的好处是什么呢?@golukashyap,这样你就可以将1000行的monster函数重构为200个静态函数和200个私有类,而不需要任何人注意。使用
:
这是不同的方法,但原理是一样的。如果在标头中声明了私有结构,则标头的用户只能将其用作不完整类型(即通过指针),但看不到内容。在您的x.cpp中,语句x::abc{}
;使用范围解析运算符定义x
中的abc
。(与成员函数的语法类似)。