Разница между статикой в ​​C и статикой в ​​С++?? - программирование
Подтвердить что ты не робот

Разница между статикой в ​​C и статикой в ​​С++??

В чем разница между ключевым словом static в C и С++?

4b9b3361

Ответ 1

Ключевое слово static выполняет те же задачи в C и С++.

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

    Эти элементы файлового уровня (функции и данные) должны быть статическими, если нет необходимости обращаться к ним извне (и почти никогда не требуется прямой доступ к данным, поскольку это нарушает центральный принцип инкапсуляции).
    < ш > Если (как указывает ваш комментарий к вопросу), это единственное использование static, о котором вы беспокоитесь, то нет, нет никакой разницы между C и С++.

  • При использовании внутри функции она устанавливает длительность элемента. Опять же, продолжительность такая же, как и у программы, и элемент продолжает существовать между вызовами этой функции. Это не влияет на видимость этого элемента, поскольку оно видимо только внутри функции. Примером является генератор случайных чисел, который должен сохранять свое начальное значение между вызовами, но не хочет, чтобы это значение было видимым для других функций.

  • У С++ есть еще одно использование, static внутри класса. При использовании там он становится единственной переменной класса, которая является общей для всех объектов этого класса. Один классический пример - хранить количество объектов, которые были созданы для данного класса.

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

И даже если он устарел, это не изменит его семантику.

Ответ 2

Использование static в области файлов для ограничения доступа к текущей системе перевода устарело в С++, но все же приемлемо в C.

Вместо этого используйте неназванное пространство имен

namespace
{
    int file_scope_x;
}

Переменные, объявленные таким образом, доступны только в файле, как если бы они были объявлены static.

Основной причиной устаревания является удаление одного из нескольких перегруженных значений ключевого слова static.

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

Затем ключевое слово было перегружено для применения к привязке к файлу. Нежелательно составлять новые ключевые слова по мере необходимости, поскольку они могут нарушить существующий код. Таким образом, этот был использован снова с другим значением, не вызывая конфликтов, потому что переменная, объявленная как статическая, не может быть как внутри функции, так и на верхнем уровне, а функции раньше не имели модификатора. (Консоляция хранения полностью потеряна при обращении к функциям, поскольку они нигде не хранятся.)

Когда классы приходили на С++ (а на Java и С#) ключевое слово использовалось еще раз, но значение по крайней мере ближе к первоначальному намерению. Переменные, объявленные таким образом, хранятся в глобальной области, а не в стеке, как для переменных функции, так и в куче как для членов объекта. Поскольку переменные не могут быть как на верхнем уровне, так и внутри определения класса, дополнительный смысл может быть однозначно привязан к переменным класса. На них можно ссылаться только через имя класса или внутри объекта этого класса.

Ответ 3

Он имеет то же значение на обоих языках.

Но С++ добавляет классы. В контексте класса (и, следовательно, структуры) он имеет дополнительное значение для того, чтобы сделать члены класса/переменных класса скорее членами объекта.

class Plop
{
    static int x; // This is a member of the class not an instance.

    public:
    static int getX() // method is a member of the class.
    {
        return x;
    }
};

int Plop::x  = 5;

Ответ 4

Обратите внимание, что использование static для обозначения "область действия файла" (как область пространства имен) только переоценивается стандартом С++ для объектов, а не для функций. Другими словами:

// foo.cpp  
static int x = 0;               // deprecated
static int f() { return 1; }    // not deprecated

Чтобы привести Приложение D стандарта:

Использование ключевого слова static устарел при объявлении объектов в область пространства имен.

Ответ 5

Вы не можете объявить статическую переменную внутри структуры в C... Но разрешено в Cpp с помощью оператора разрешения области.

Также в статической функции Cpp можно обращаться только к статическим переменным, но в C статическая функция может иметь статические и нестатические переменные... 😊