Статические переменные в C++ и Java

у меня вопрос: допустим, у нас есть эта функция: (в C++)

int& f() {
    static int x = 0;
    return x;
} // OK

и

int& h() {
    int x=0;
    return x;
} // ERROR

почему h выдаст ошибку? Это из-за ключевого слова static? Я нашел static ключевое слово позволяет my x переменная live после завершения моей функции. Таким образом, я все еще могу получить доступ к этому местоположению памяти извне (другая функция или main? правильно?). Вместо int x = 0 теряется после h завершается. Правильно? Я не уверен, что я действительно получил это!

а как насчет Java? Я читаю, я не могу объявить static переменные в методах, но только в классах.

спасибо.

4 ответов


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

переменная, которая определяется внутри функции с помощью static спецификатор имеет статическую продолжительность хранения - он занимает одно и то же пространство для всего времени выполнения программы и сохраняет свое значение между различными вызовами функции. Так что можно смело возвращать ссылку на него, а переменная всегда придет ссылка.

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

Java просто не имеет функции-scope static переменные (он не имеет этого значения ключевого слова static). Вот почему вы не можете заявить об этом там.

оба C++ и Java имеют значение "Class-scope"static ключевое слово. Когда член класса объявлен static ключевое слово, это означает, что член не привязан ни к одному экземпляру класса, А является просто глобальной переменной, идентификатор которой живет в области класса.


Static ключевое слово используется для почти той же цели как в C++, так и в Java. Однако есть некоторые различия.

1) Статические Члены Данных: как и C++, статические члены данных в Java являются членами класса и совместно используются всеми объектами.

2) Статические Методы Члена: как и C++, методы, объявленные как статические, являются членами класса и имеют следующие ограничения:

  • (i) они могут вызывать только другие статические методы.
  • (ii) они должны иметь доступ только к статическим данным.
  • (iii) они не могут получить доступ this или super

Как и C++, статические члены данных и статические методы могут быть доступны без создания объекта. К ним можно получить доступ, используя имя класса.

3) Статический Блок: в отличие от C++, Java поддерживает специальный блок, называемый статическим блоком (также называемый статическим предложением), который может использоваться для статической инициализации класса. Настоящий кодекс внутри статический блок выполняется только один раз (при первом создании объекта этого класса или при первом доступе к статическому члену этого класса (даже если вы никогда не делаете объект этого класса)).

4) Статические Локальные Переменные: в отличие от C++, Java не поддерживает статические локальные переменные. Если используется , программа Java терпит неудачу в компиляции.

5) статический класс: классы также могут быть сделаны статическими в Java.В java мы не можем сделать класс верхнего уровня статическим. Статическими могут быть только вложенные классы.

  • вложенный статический класс не требует Ссылки на внешний класс, но нестатический вложенный класс или внутренний класс требует Ссылки на внешний класс.
  • внутренний класс (или нестатический вложенный класс) может получить доступ как к статическому, так и к нестатические члены внешнего класса. Статический класс не может получить доступ нестатические члены внешнего класса. Он может получить доступ только к статическим члены внешнего класса.

    Ref : www.geeksforgeeks.org


для стороны Java вы правы. Статические переменные в Java должны быть объявлены на уровне класса, а не внутри метода.

Если вам нужно охватить статические переменные, то у вас, вероятно, есть какая-то серьезно нарушенная архитектура, но вы можете сделать это в определенной степени, используя внутренние классы для хранения статических переменных.


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