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::f
má přístup kprivate
aprotected
složkám instancí třídyA
, kdežto::f
ne [ISO C++98, 11.1]. - Kvalifikovaný přístup. Statická metoda
A::f
je ve jmenném prostoruA
, kdežto::f
je 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é :).