如何在c++中创建私有函数

ocebsuys  于 2023-01-06  发布在  其他
关注(0)|答案(5)|浏览(218)

我是从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?
}
wa7juj8i

wa7juj8i1#

在C++中,命名空间中没有私有函数。通常人们使用命名空间来专门描述实现的细节:

namespace clazz {
    namespace detail {
        void bar();
    }

    void foo();
}
mwyxok5s

mwyxok5s2#

如果你想限制一个非示例方法的访问,你必须把它变成一个类的static方法。例如在C++中:

class clazz
{
  public:
     static void foo();

  private:
     static void bar();
};

值得一提的是,如果只在一个.cpp文件中使用bar,则使用匿名名称空间以防止在其他地方访问该文件,因此您将得到如下内容:

clazz.小时:

namespace clazz 
{
    void foo();
}

分类cpp:

#include "clazz.h"

namespace
{
    // bar can only be used in this file
    void bar() { /* bar implementation */ }
}

void clazz::foo() { /* foo implementation */ }
eblbsuwk

eblbsuwk3#

来自Java的你可能没有意识到在C++中实现通常是在一个独立于类声明的文件(.cpp,.cc)中(.h,.hpp)。对于只需要存在于一个cpp文件中的实用函数,最好的方法是将它们放在一个匿名命名空间中。

namespace {
void my_utility_function(const Something &something) {
   // bunch of code
}
} // close namespace

这个函数在这个cpp文件的任何地方都是可见的,* 但是在其他地方是不可见的 *。所以需要my_utility_function的类方法在下面实现。
当一个函数在命名空间中时,链接器会为它发出数据,并浪费时间在程序的其他地方寻找用法。(通过使用命名空间),这是对CPU的浪费。这也 * 证明 * 了它基本上是私有的。在C中,一个标记为static的函数具有相同的效果,但是static有许多不同的含义,AFAIK匿名命名空间是更好的样式。
如果整个cpp文件都在一个命名空间中,那么可以将匿名命名空间嵌套在一个命名空间中。

thtygnil

thtygnil4#

在C++ class中,成员函数默认为private
您可以使用访问说明符显式地声明这一点,如下所示:

private:

此效果一直持续到类中的下一个访问说明符或类定义的结尾。
C与Java的一个区别是私有成员函数不是final的。当它们是virtual时,它们可以在派生类中被覆盖。在C中,要被覆盖的成员函数通常是私有的。
C++命名空间没有可访问性。
实际上它们都是public
Boost库使用一种约定,其中名为detail的嵌套名称空间被视为实现细节,就好像它是私有的一样。
更直接的命名可以是implimplementation
这样的约定足以防止对实现细节的“无意”访问和依赖。

ghg1uchk

ghg1uchk5#

解决这个问题的“C++方法”是像您所做的那样使用名称空间,并给予bar内部链接。
clazz::bar()将可从此源文件中的任何位置调用,而不仅仅是从foo()调用。请将其保留在namespace clazzprotects against Murphy, not Machiavelli中。如果此可见性确实存在问题,则可以:

  • 将您的代码分隔为多个源文件,以便此文件仅包含foobar
  • 使用只带有静态成员函数的class作为黑客

内部链接的最简单语法是:

static void bar() { }

尽管您可以使用匿名名称空间。

相关问题