2014-06-18 4 views
5

У меня есть вопрос: давайте говорить, что мы имеем эту функцию: (в C++)Статические переменные в C++ и Java

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

и

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

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

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

спасибо.

+1

Это не является ошибкой, если вы не используете '-Werror'. Но http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – ghostofstandardspast

+0

C++: да. Java: один вопрос за раз! – juanchopanza

+0

По одному за раз. Попросите C++ или Java. И да, ключевое слово 'static' имеет другое значение в Java. –

ответ

14

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

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

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

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

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

+0

Я бы поставил точность на статические переменные C++ (или C). Поскольку у них есть только одно пространство по всей программе, они не являются повторными: в многопоточных программах они имеют общую ценность между всеми потоками. И если вы хотите вызвать функцию рекурсивным образом, они не будут толкаться и не складываться. –

+0

@SergeBallesta Что означает «переменная повторного входа»? Я всегда понимал * код * как повторный или потокобезопасный, а не * данные.* Но вы, конечно, правы, что локальная переменная 'static' - это просто глобальная переменная со смешными правилами доступа к именам. – Angew

+0

Я согласен с тобой, что переменная повторного входа ничего не значит. Но когда у вас есть статическая переменная в функции, функция будет иметь проблемы с повторным входом ... –

0

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

+0

@jaunchopanza, это своего рода право на случай переменных, объявленных 'static' в области функций. Это неполное, однако, поскольку оно игнорирует другие виды использования сильно перегруженного ключевого слова 'static', чтобы квалифицировать переменные в других областях. – 0xbe5077ed

+0

@juanchopanza Извините, я указал, что это только когда объявлено в функции. Это верно? –

+0

Да, это звучит правильно. – juanchopanza

0

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

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

2

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

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

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

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

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

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

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

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

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

    Ref: www.geeksforgeeks.org

+0

Вербальное повторение этой страницы: http://www.geeksforgeeks.org/static-keyword-in-java/. автор этой статьи или плагиат? Если первый, скажите так в своем посте, чтобы мы знали. – Kallaste

Смежные вопросы