如何在* .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代替的效果。从预处理器模块切换到编译器模块。
这意味着你的静态成员函数的声明和定义一直在同一个文件中。