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

Od Petr Zemek, 2010-05-14

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é :).

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
4 + 11 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.