Разница между статическим в C и статическим в C ++ - PullRequest
52 голосов
/ 03 июня 2009

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

Ответы [ 5 ]

82 голосов
/ 03 июня 2009

Ключевое слово static служит тем же целям в C и C ++.

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

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

    Если (как указывает ваш комментарий к вопросу) это единственное использование static, которое вас интересует, то нет, между C и C ++ нет никакой разницы.

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

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

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

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

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

14 голосов
/ 03 июня 2009

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

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

namespace
{
    int file_scope_x;
}

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

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

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

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

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

9 голосов
/ 03 июня 2009

Имеет одинаковое значение на обоих языках.

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

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;
6 голосов
/ 03 июня 2009

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

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

Цитировать Приложение D к Стандарту:

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

1 голос
/ 10 апреля 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...