Что именно «статично» означает при объявлении «глобальных» переменных в C ++?

StackOverflow https://stackoverflow.com/questions/3416728

  •  26-09-2019
  •  | 
  •  

Вопрос

Это расширение масштаба предыдущий вопрос мой.

Что именно «статично», как он используется, и какова цель использования «статического» при работе с C ++?

Спасибо.

Это было полезно?

Решение

Ключевое слово static Имеет разные значения в C ++ в зависимости от контекста.

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

// test.cpp
static int a = 1;
static void foo() {}

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

// test2.cpp
namespace {
   static int a = 1;
   static void foo() {}
}

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

int foo() {
   static int counter = 0;
   return ++counter;
}
int main() {
  for ( int i = 0; i < 10; ++i ) { 
     std::cout << foo() << std::endl;
  }
}

В предыдущем коде counter инициализируется один раз, когда foo Вызывается впервые, но переменная переживет функцию и сохраняет значение в различных вызовах функции. Предыдущий код будет печать «1 2 3 4 ... 10». Если переменная не была объявлена static Затем вывод будет «1 1 1 ... 1».

В рамках класса, static означает, что член является членом класса, а не из определенного экземпляра. Это использование эквивалентно использованию в вашем другом вопросе: использование этого конкретного члена не связано с каким-либо конкретным объектом.

struct test {
   int x;
   static int y;
};
int test::y;       // need to define it in one translation unit
int main() {
   // test::x = 5; // !error cannot access a non-static member variable
                   // without an instance
   test::y = 5;    // ok
   test t, other;
   t.x = 10;       // ok
   t.y = 15;       // ok, the standard allows calling a static member through
                   // an instance, but this is the same as test::y
}

В этом случае член x нестатический атрибут участника, а как таковой, другой x для каждого экземпляра класса. В образце программы t.x а также other.x обратитесь к разным целым числам. С другой стороны y является static И, таким образом, есть один экземпляр test::y в программе. Даже если стандарт позволяет звонить t.y а также other.y Оба используются относятся к той же переменной. То же самое идет с методами членов. Если они являются статическими, они являются методами уровня классов и могут быть вызваны без экземпляра, в то время как если они не являются статическими, они применяются к конкретному экземпляру a.b или a->b Синтаксис должен быть использован.

Это использование static похож на использование того же ключевого слова в Java, в то время как два других нет на этом языке. Существует одно использование ключевого слова в Java, которое не присутствует в C ++, и это использование инициализирующих статических классов (блок кода на уровне класса, окруженный static { ... }). В Java этот блок кода будет выполнен, когда класс загружен и только один раз. Инициализация переменных статических элементов в C ++ должна выполняться в инициаторов определения переменной.

Другие советы

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

static int x = 0;    

должно быть:

namespace {
    int x = 0;    
}

Эти вещи, кажется, довольно хорошо покрыты здесь.

Но чтобы перефразировать, есть 2 использования в C

  1. Предотвратите использование глобальной переменной за пределами объема файла, который его определяет.
  2. Разрешить локальные переменные в рамках функции, чтобы сохранить вызовы аккреосс функции, как в

    int detnextid () {статический int id = 0; возврат ID ++; }

C ++ наследует обоих них, и добавляет свои собственные виды применения.

  1. Переменные статического элемента: Переменные, которые «совместно используются» Accross все экземпляры класса, а также могут быть доступ без ссылки на экземпляр класса. Поделиться, похоже на неправильное слово, но по сути, я верю, что результатом является то, что любая ссылка на статическую переменную элемента, ссылается на то же местоположение памяти.
  2. Статические методы: методы, которые могут быть вызваны без ссылки на конкретный экземпляр класса, который его определяет.

Статическое в основном означает, что переменная привязана к срок службы программы, а не из любой заданной функции или экземпляра класса. Когда вы должны использовать это? Не делать. Какова цель? Данные отладки, в основном.

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

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

В C и C ++ при статическом использовании используется для глобальной переменной или функции, то она означает, что переменная может быть ссылаться только в текущем файле C или C ++. Другими словами, компилятор не должен генерировать какие-либо символы перемещения для переменной или функции.

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

Члены статического класса являются данными и функциями, которые связаны с самим классом, а не с объектами класса.

В следующем примере есть класс FRED имеет статический элемент данных x_ и элемент данных экземпляра Y_. Существует только одна копия Фреда :: X_ независимо от того, насколько созданы Фреда объекты (включая безрезных объектов), но есть один объект Y_ на FRED. Таким образом, X_ говорят, что связан с классом, а Y_, как говорят, связан с отдельным объектом класса. Аналогичным образом Class Fred имеет статический элемент F () и функцию элемента экземпляра G ().

class Fred {
    public:
        static void f() throw();                           <-- 1
        void g() throw();                                  <-- 2
    protected:
        static int x_;                                     <-- 3
        int y_;                                            <-- 4
};

(1) Функция участника, связанная с классом

(2) Функция участника, связанная с индивидуальным объектом класса

(3) член данных, связанный с классом

(4) член данных, связанный с отдельным объектом класса

Применение:

Когда вы хотите продолжать тракт количества экземпляров класса, созданного, вы используете статическую переменную. Например, в классе «Car» каждый экземпляр автомобиля может иметь уникальный серийный номер (_y в этом случае), и компания может захотеть отслеживать количество произведенных автомобилей (_x в этом случае).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top