Что означают термины на каждом из вышеуказанных языков? Почему языки отличаются (где бы они ни были, если они вообще делают) в этом отношении?
Объявления, определения, инициализации в C, С++, С#, Java и Python
Ответ 1
C/С++:
Объявление - это утверждение, в котором говорится: "Вот имя чего-то и того типа, что есть, но я больше ничего не рассказываю".
Определение - это утверждение, в котором говорится: "Вот имя чего-то и что именно оно". Для функций это будет тело функции; для глобальных переменных это будет единица перевода, в которой находится переменная.
Инициализация - это определение, в котором переменной также присваивается начальное значение. Некоторые языки автоматически инициализируют все переменные до некоторого значения по умолчанию, такого как 0, false или null. Некоторые (например, C/С++) не во всех случаях: все глобальные переменные инициализируются по умолчанию, но локальные переменные в стеке и динамически распределенные переменные в куче НЕ инициализируются по умолчанию - они содержат undefined, поэтому вы должны явно инициализировать их. У С++ также есть конструкторы по умолчанию, которые представляют собой целую черту червей.
Примеры:
// In global scope:
extern int a_global_variable; // declaration of a global variable
int a_global_variable; // definition of a global variable
int a_global_variable = 3; // definition & initialization of a global variable
int some_function(int param); // declaration of a function
int some_function(int param) // definition of a function
{
return param + 1;
}
struct some_struct; // declaration of a struct; you can use pointers/references to it, but not concrete instances
struct some_struct // definition of a struct
{
int x;
int y;
};
class some_class; // declaration of a class (C++ only); works just like struct
class some_class // definition of a class (C++ only)
{
int x;
int y;
};
enum some_enum; // declaration of an enum; works just like struct & class
enum some_enum // definition of an enum
{
VALUE1,
VALUE2
};
Я не так хорошо знаком с другими языками, о которых вы спрашивали, но я считаю, что они не делают различий между декларациями и определениями. С# и Java имеют инициализацию по умолчанию для всех объектов - все инициализируется 0, false или null, если вы явно не инициализируете его. Python еще более слабее, поскольку переменные не должны быть объявлены до их использования. Поскольку привязки разрешены во время выполнения, нет никакой реальной необходимости в объявлениях функций.