我是从java背景学习c++的。我想知道我如何在命名空间中创建一个私有函数?
我想在cpp中执行此操作
java :
public class Clazz {
public static void foo() {
// stuff
}
private static void bar() {
// other stuff
}
}
C++ :
namespace clazz {
void foo();
// what do I do here?
}
5条答案
按热度按时间wa7juj8i1#
在C++中,命名空间中没有私有函数。通常人们使用命名空间来专门描述实现的细节:
mwyxok5s2#
如果你想限制一个非示例方法的访问,你必须把它变成一个类的
static
方法。例如在C++中:值得一提的是,如果只在一个.cpp文件中使用
bar
,则使用匿名名称空间以防止在其他地方访问该文件,因此您将得到如下内容:clazz.小时:
分类cpp:
eblbsuwk3#
来自Java的你可能没有意识到在C++中实现通常是在一个独立于类声明的文件(.cpp,.cc)中(.h,.hpp)。对于只需要存在于一个cpp文件中的实用函数,最好的方法是将它们放在一个匿名命名空间中。
这个函数在这个cpp文件的任何地方都是可见的,* 但是在其他地方是不可见的 *。所以需要
my_utility_function
的类方法在下面实现。当一个函数在命名空间中时,链接器会为它发出数据,并浪费时间在程序的其他地方寻找用法。(通过使用命名空间),这是对CPU的浪费。这也 * 证明 * 了它基本上是私有的。在C中,一个标记为
static
的函数具有相同的效果,但是static
有许多不同的含义,AFAIK匿名命名空间是更好的样式。如果整个cpp文件都在一个命名空间中,那么可以将匿名命名空间嵌套在一个命名空间中。
thtygnil4#
在C++
class
中,成员函数默认为private
。您可以使用访问说明符显式地声明这一点,如下所示:
此效果一直持续到类中的下一个访问说明符或类定义的结尾。
C与Java的一个区别是私有成员函数不是final的。当它们是
virtual
时,它们可以在派生类中被覆盖。在C中,要被覆盖的成员函数通常是私有的。C++命名空间没有可访问性。
实际上它们都是
public
。Boost库使用一种约定,其中名为
detail
的嵌套名称空间被视为实现细节,就好像它是私有的一样。更直接的命名可以是
impl
或implementation
。这样的约定足以防止对实现细节的“无意”访问和依赖。
ghg1uchk5#
解决这个问题的“C++方法”是像您所做的那样使用名称空间,并给予
bar
内部链接。clazz::bar()
将可从此源文件中的任何位置调用,而不仅仅是从foo()
调用。请将其保留在namespace clazz
protects against Murphy, not Machiavelli中。如果此可见性确实存在问题,则可以:foo
和bar
。class
作为黑客内部链接的最简单语法是:
尽管您可以使用匿名名称空间。