gpt4 book ai didi

c++ - 私有(private)静态成员与将它们包含在 cpp 文件中的区别

转载 作者:行者123 更新时间:2023-11-30 03:59:05 29 4
gpt4 key购买 nike

假设我希望类 A 有一个变量和一个函数,这些变量和函数可用于所有实例,但仅限于它们。
我有两种方法(或者还有更多?):

将它们作为私有(private)静态成员:

class A {
...

private:
static int myInt;
static void myMethod();

...
};

只需将它们放在 cpp 文件中:

// h file
class A {
...
};

// cpp file
static int myInt;
static void myFunction() { ... }

如我所见,这两个选项都可以,但除了与设计相关的参数外,还有什么区别?
哪个选项比另一个更好?
是否存在任何性能或优化问题?
谢谢。


编辑

似乎我不够清楚,所以这里有一个更好的例子(留下旧的,以便以前的评论/答案有意义):

第一个选项:

// h file
class A {
public:
A();
~A();

void doSomething();

private:
static std::queue queue;
static boost::mutex mutex;

static void initQueue();
};

// cpp file

// let's assume this method can be called multiple times but only initiates the queue on the first call
void A::initQueue() {
boost::unique_lock<boost::mutex> lock(A::mutex);
...
}

void A::A() {
A::initQueue();
}

void A::doSomething() {
// have full access to the A::queue/A::mutex
}

第二个选项:

// h file
class A {
public:
A();
~A();

void doSomething();
};

// cpp file
static std::queue queue;
static boost::mutex mutex;

static void initQueue() {
boost::unique_lock<boost::mutex> lock(Amutex);
...
}


void A::A() {
initQueue();
}

void A::doSomething() {
// have full access to the queue/mutex
}

至于可见性,我的意思是通过包含 A.h,我无法访问变量/函数,只能从 A 类中访问。
我不是指如何保护它们免受恶意代码之类的攻击。<​​/p>

最佳答案

私有(private)成员是类的用户无法访问的实现细节。在头文件中公开它们会产生不必要的编译依赖性。例如,私有(private)成员可能需要包含其他头文件,这会减慢包含头文件的翻译单元的编译速度;更改头文件中的实现细节需要重新编译其所有用户。因此,最好的做法是仅在头文件中公开用户可以直接使用的内容(公共(public) API),并尽可能避免在公共(public) API 头中公开实现细节。

Herb Sutter 在 GotW #100: Compilation Firewalls 中对这个主题进行了彻底的处理。 .


您可以轻松地将所有非公共(public)静态类成员移动到一个 .cc 文件和一个未命名的命名空间中。

非静态数据成员可以移到 Pimpl 中或隐藏在抽象接口(interface)后面。 Pimpl 的优点是它不需要用户直接处理智能指针和工厂,并且不使用虚拟调用,这比非虚拟调用稍微慢一些。

隐藏数据成员实现的运行时成本是成员函数的实现必须在 .cc 中,这样在没有链接时就无法内联对类 API 的调用代码生成。

关于c++ - 私有(private)静态成员与将它们包含在 cpp 文件中的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112147/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com