Jste zde

Méně známé skutečnosti o C++: Rozdíl mezi funkcí a statickou metodou třídy

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 k private a protected složkám instancí třídy A, kdežto ::f ne [ISO C++98, 11.1].
  • Kvalifikovaný přístup. Statická metoda A::f je ve jmenném prostoru A, kdežto ::f je na globální úrovni. Pokud existuje instance třídy A, třeba b, tak pak lze volat b.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é :).

Přidat komentář