Подтвердить что ты не робот

Почему статическая функция-член _declared_ static, но _defined_ в противном случае на С++?

Вот минимальный рабочий пример:

хиджры:

class A{
        static int a_member_function();
};

a.cpp

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


int main(){ return 1;}

Этот код компилируется и запускается, но мне кажется, что:

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

можно было бы также легко использовать для определения статической функции-члена класса A. Действительно, кажется, что на самом деле было бы весьма полезно иметь это требование, поскольку это напомнит читателю .cpp файла, что a_member_function является статическим.

Однако это явно не работает:

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

Так почему же это не работает? Каковы причины этого решения?

4b9b3361

Ответ 1

Причина заключается в том, что дух С++ пытается минимизировать количество ключевых слов и поддерживать обратную совместимость с C: static в этой позиции имеет совершенно другое значение.

Все это возвращается к C. "Статические" функции в C - это функции, которые уникальны для единицы компиляции (файл .c). К другим модулям компиляции они не могут быть доступны (это один из способов инкапсуляции на C). Это использование все еще действует на С++. Вы также можете сделать то же самое для глобальных переменных, чтобы ограничить область действия.

Хотя на С++ вы также хотите объявить функции-члены как static по другой причине: эти функции принадлежат классу, но не требуют и экземпляр указанного класса для запуска (я уверен, вы уже знаете, что я просто пытаясь быть полным).

Определение функции-члена как static приведет к противоречию: эту функцию нужно получить за пределами ее единицы перевода.

В другом случае повторное использование ключевого слова между C и С++, ключевым словом auto в С++ 11, но это вряд ли будет проблемой.

Примечание: То же самое происходит с ключевым словом virtual, которое присутствует в объявлении, а не в определении.