如何在* .cpp文件中实现静态类成员函数?

是否有可能在* .cpp文件中实现static类成员函数,而不是在头文件中执行它?

所有的static函数都是inline吗?

它是。

test.hpp:

 class A { public: static int a(int i); }; 

TEST.CPP:

 #include <iostream> #include "test.hpp" int A::a(int i) { return i + 2; } using namespace std; int main() { cout << A::a(4) << endl; } 

它们并不总是内联的,不,但是编译器可以做到这一点。

尝试这个:

header.hxx:

 class CFoo { public: static bool IsThisThingOn(); }; 

class.cxx:

 #include "header.hxx" bool CFoo::IsThisThingOn() // note: no static keyword here { return true; } 

helper.hxx

 class helper { public: static void fn1 () { /* defined in header itself */ } /* fn2 defined in src file helper.cxx */ static void fn2(); }; 

helper.cxx

 #include "helper.hxx" void helper::fn2() { /* fn2 defined in helper.cxx */ /* do something */ } 

A.cxx

 #include "helper.hxx" A::foo() { helper::fn1(); helper::fn2(); } 

要了解更多关于c ++如何处理静态函数的信息,请访问: c ++中的静态成员函数是否在多个翻译单元中复制?

是的,您可以在* .cpp文件中定义静态成员函数。 如果你在头文件中定义它,编译器默认将它视为内联。 但是,这并不意味着可执行文件中将存在单独的静态成员函数副本。 请按照这个post了解更多关于这个: c ++中的静态成员函数复制在多个翻译单位?

@crobar,你是正确的,缺乏多文件的例子,所以我决定分享以下的希望,以帮助其他人:

 :::::::::::::: main.cpp :::::::::::::: #include <iostream> #include "UseSomething.h" #include "Something.h" int main() { UseSomething y; std::cout << y.getValue() << '\n'; } :::::::::::::: Something.h :::::::::::::: #ifndef SOMETHING_H_ #define SOMETHING_H_ class Something { private: static int s_value; public: static int getValue() { return s_value; } // static member function }; #endif :::::::::::::: Something.cpp :::::::::::::: #include "Something.h" int Something::s_value = 1; // initializer :::::::::::::: UseSomething.h :::::::::::::: #ifndef USESOMETHING_H_ #define USESOMETHING_H_ class UseSomething { public: int getValue(); }; #endif :::::::::::::: UseSomething.cpp :::::::::::::: #include "UseSomething.h" #include "Something.h" int UseSomething::getValue() { return(Something::getValue()); } 

你当然可以。 我会说你应该。

这篇文章可能是有用的:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/

#include指令的字面意思是“将该文件中的所有数据复制到这个位置”。 所以当你包含头文件的时候,它的文本在代码文件中,当代码文件(现在称为编译单元或者翻译单元 )是代码文件的时候,其中的所有内容都会在那里,给出或者采取其他指令或者macros代替的效果。从预处理器模块切换到编译器模块。

这意味着你的静态成员函数的声明和定义一直在同一个文件中。