Občas se lze setkat s názorem, že statická metoda třídy je to stejné, co obyčejná funkce. V tomto krátkém příspěvku vás přesvědčím, proč tomu tak není ;).
Mějme následující třídu A se statickou metodou A::f a funkci ::f, kde obě mají jako parametr objekt třídy A:
class A { public: static void f(A a) { // ... } }; void f(A a) { // ... }
Rozdíly mezi A::f a ::f jsou v podstatě dva (pokud víte o jiném, určitě to napište do komentáře). Důležitý je především ten první; ten druhý je zde jen pro úplnost.
- Přístup k interním složkám instancí třídy A. Statická metoda
A::fmá přístup kprivateaprotectedsložkám instancí třídyA, kdežto::fne [ISO C++98, 11.1]. - Kvalifikovaný přístup. Statická metoda
A::fje ve jmenném prostoruA, kdežto::fje na globální úrovni. Pokud existuje instance třídyA, třebab, tak pak lze volatb.f(), což u funkce (pochopitelně) není možné [ISO C++98, 9.4.2].
Libovolná funkce tedy není to stejné, co libovolná statická metoda třídy. Jelikož o jiných rozdílech, než tyto dva uvedené, nevím, tak pokud danou funkci umístíte do odpovídajícího prostoru jmen, uděláte ji spřátelenou, a nebudete ji chtít volat jako metodu objektu, tak pak by tyto dva koncepty měly být snad stejné :).