2017-01-10 90 views
0

说我有一个类,在头文件如下:C++静态函数:放在课堂的内部还是外部?

class A { 
public: 
    void foo(); 
} 

foo需要调用名为bar又一个“助手”功能,该功能。除foo以外,其他地方都不需要酒吧。

(源文件)

static void bar() { ... } 
void A::foo() { 
    bar(); ... 
} 

或类中:它应该被的A范围之外静态定义?不需要

(头)

class A { 
public: 
    void foo(); 

private: 
    void bar(); 
} 

(烃源)

void A::bar() { ... } 
void A::foo() { 
    bar(); ... 
} 

回答

2

一般情况下,你应该只在必要时允许访问一个类的内部。将函数放在类之外并限制它的作用域 - 无论是作为静态函数还是匿名命名空间,都是最好的。这样,您不会污染全局名称空间,并且不允许不必要地访问类内部。

例如,你可以在类的CPP文件有:

namespace { 
    void bar() {.....} 
} 

和辅助功能则可以在同一个CPP文件类的方法。

cpp文件中的静态函数也只有文件范围,但我发现static关键字在使用时会造成混淆。

+1

越隐藏越好。我同意“静态非类”选项是最隐藏的选项(除了A类本身的编译单元)。 IMO唯一的例外是该函数访问类A的静态成员,在这种情况下,它将成为A的静态私有类成员的候选人。 –

+0

谢谢,这与我所寻找的最接近。 –

2

酒吧里面比其他foo的其他任何地方。

如果是这样那么bar应该是A类的私有成员函数 - 没有必要在全局命名空间中定义bar

static void bar() { ... } // not needed 

改用:

void A::bar() { ... } // <- bar should be private member function 
+0

即使函数并不真正属于类的一般用途/焦点,它应该在类中定义吗? –

+0

我这么认为,它是辅助函数,但在这种情况下,你提到它只在类“A”中需要。另一方面,如果需要在不同的班级,那么你可以考虑把它移到公用事业类。 – artm

相关问题