2012-11-23 12 views
18

Oto minimalne przykład roboczych:Dlaczego funkcja statycznego elementu _declared_ static, ale _defined_ inaczej w C++?

Ah:

class A{ 
     static int a_member_function(); 
}; 

A.cpp

#include "A.h" 
int A::a_member_function(){return 5;} 


int main(){ return 1;} 

Ten kod kompiluje i działa, ale wydaje mi się, że:

static int A::a_member_function(){return 5;} 

może równie dobrze zostać użyte do zdefiniowania statycznej funkcji członka c lass. Rzeczywiście, wydaje się, że może to być raczej użyteczne, aby mieć to wymaganie, ponieważ przypomniałoby to czytelnikowi pliku .cpp, że a_member_function jest statyczna.

to jednak wyraźnie nie działa:

error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive] 

Więc dlaczego nie działa? Jakie jest uzasadnienie tej decyzji?

Odpowiedz

23

Powodem jest duch C++, aby spróbować i zminimalizować liczbę jego słów kluczowych i zachować zgodność wstecz z C: static w tej pozycji ma zupełnie inne znaczenie.

To wszystko poprzedza powrót do C. "statyczne" funkcje w C są funkcjami unikalnymi dla jednostki kompilacji (plik .c). Nie mogą być dostępne przez inne jednostki kompilacji (jest to jeden ze sposobów na enkapsulację w C). To użycie jest nadal poprawne w C++. Możesz także zrobić to samo dla zmiennych globalnych, aby ograniczyć ich zakres.

Chociaż w C++ chcesz zadeklarować funkcje składowe jako static z innego powodu: te funkcje należą do klasy, ale nie wymagają i instancji tej klasy do uruchomienia (założę się, że już wiesz, po prostu próbuję być kompletnym).

Definiowanie funkcji składowej jako static doprowadziłoby do sprzeczności: ta funkcja musi być dostępna poza jednostką tłumaczeniową.

Istnieje inny przypadek ponownego użycia słowa kluczowego między C i C++, słowo kluczowe auto w C++ 11, ale jest mniej prawdopodobne, że będzie to problem.

Uwaga: To samo dzieje się z virtual słów kluczowych, która jest obecna w deklaracji, a nie definicji.

+0

Ah. Ma jakiś sens. Dzięki! –