it-swarm.com.ru

В чем разница между статической и константной переменными?

Может кто-нибудь объяснить разницу между переменной static и const?

56
jaimin

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

Эти два понятия не являются взаимоисключающими и могут использоваться вместе.

38
Stefan Kendall

Краткий ответ:

const - это обещание, что вы не будете пытаться изменить значение после его установки. 

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

C99 заимствовал использование const из C++. С другой стороны, static был источником многих дискуссий (на обоих языках) из-за его часто сбивающей с толку семантики.

Кроме того, с C++ 0x до C++ 11 использование ключевого слова static не рекомендуется для объявления объектов в области пространства имен. Это осуждение было удалено в C++ 11 по разным причинам (см. здесь ).

Более длинный ответ: больше о ключевых словах, чем вы хотели знать (прямо из стандартов):

C99

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

/* file scope, static storage, internal linkage */
static int i1; // tentative definition, internal linkage
extern int i1; // tentative definition, internal linkage

int i2; // external linkage, automatic duration (effectively lifetime of program)

int *p = (int []){2, 4}; // unnamed array has static storage

/* effect on string literals */
char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
char *p = (char []){"/tmp/fileXXXXXX"}; // static, modifiable
const char *cp = (const char []){"/tmp/fileXXXXXX"}  // static, non-modifiable


void f(int m)
{
    static int vla[ m ]; // err

    float w[] = { 0.0/0.0 }; // raises an exception

    /* block scope, static storage, no-linkage */
    static float x = 0.0/0.0; // does not raise an exception
    /* ... */
     /* effect on string literals */
    char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
    char *p = (char []){"/tmp/fileXXXXXX"}; // automatic storage, modifiable
    const char *cp = (const char []){"/tmp/fileXXXXXX"}  // automatic storage, non-modifiable

}

inline void bar(void)
{
     const static int x = 42; // ok
     // Note: Since an inline definition is distinct from the 
     // corresponding external definition and from any other
     // corresponding inline definitions in other translation 
     // units, all corresponding objects with static storage
     // duration are also distinct in each of the definitions
     static int y = -42; // error, inline function definition
}

// the last declaration also specifies that the argument 
// corresponding to a in any call to f must be a non-null 
// pointer to the first of at least three arrays of 5 doubles
void f(double a[static 3][5]);

static void g(void); // internal linkage

C++

Имеет в основном ту же семантику, за исключением отмеченного в кратком ответе. Также нет параметров, квалифицирующих statics. 

extern "C" {
static void f4(); // the name of the function f4 has
                  // internal linkage (not C language
                  // linkage) and the function’s type
                  // has C language linkage.
}

class S {
   mutable static int i; // err
   mutable static int j; // err
   static int k; // ok, all instances share the same member
};

inline void bar(void)
{
     const static int x = 42; // ok
     static int y = -42; // ok
}

Есть еще несколько нюансов C++ static, которые я здесь опущу. Посмотрите на книгу или стандарт.

22
dirkgently

Статические переменные:

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

Переменные Const:

  • Переменные const - это обещание, что вы не собираетесь менять его значение где-либо в программе. Если вы сделаете это, он будет жаловаться.
7
user3681970

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

Проверьте это сайт .

5
H. Green

Статические переменные в контексте класса являются общими для всех экземпляров класса.

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

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

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

class myClass {
public:
     static const int TOTAL_NUMBER = 5;
     // some public stuff
private:
     // some stuff
};
3
Xorlev

const эквивалентен #define, но только для операторов значений (например, #define myvalue = 2). Объявленное значение заменяет имя переменной перед компиляцией.

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

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

Другое использование статики включает объекты. Объявление статической переменной в объекте приводит к тому, что это значение одинаково для всех экземпляров объекта. Как таковой, он не может быть вызван с именем объекта, но только с именем класса.

public class Test 
{ 
    public static int test;
}
Test myTestObject=new Test();
myTestObject.test=2;//ERROR
Test.test=2;//Correct

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

3
ThunderGr

static означает локальный для модуля компиляции (то есть один файл исходного кода C++), или, другими словами, это означает, что он не добавлен в глобальное пространство имен. у вас может быть несколько статических переменных в разных файлах исходного кода c ++ с same name и без конфликтов имен.

const просто константа, значение не может быть изменено.

2
invalidopcode

Статические переменные являются общими для всех экземпляров типа.

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

в отличие от констант, значения статических переменных могут быть изменены во время выполнения.

2
this. __curious_geek

Статическая переменная может получить начальное значение только один раз. Это означает, что если у вас есть код, такой как «static int a=0» в примере функции, и этот код выполняется при первом вызове этой функции, но не выполняется при последующем вызове функции; переменная (a) по-прежнему будет иметь свое текущее значение (например, текущее значение 5), поскольку статическая переменная получает начальное значение только один раз.

Постоянная переменная имеет значение константы во всем коде. Например, если вы установите постоянную переменную, например, «const int a=5», то это значение для «a» будет постоянным во всей вашей программе.

2
celine

Ключевое слово static определяет область видимости переменных, а ключевое слово const определяет значение переменной, которое нельзя изменить во время выполнения программы. 

0
sumera

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

0
shivapola

статический

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

Пример:

#include <iostream>

class dummy
{
        public:
                static int dum;
};


int dummy::dum = 0; //This is important for static variable, otherwise you'd get a linking error

int main()
{
        dummy d;
        d.dum = 1;

        std::cout<<"Printing dum from object: "<<d.dum<<std::endl;
        std::cout<<"Printing dum from class: "<<dummy::dum<<std::endl;

        return 0;
}

Это напечатало бы: Печать dum из объекта: 1 Печать dum из класса: 1

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

const

используется, чтобы сделать его доступной только для чтения. Вам нужно сразу определить и объявить переменную const.

В той же программе, упомянутой выше, давайте сделаем также dum const:

class dummy
{
        public:
                static const int dum; // This would give an error. You need to define it as well
                static const int dum = 1; //this is correct
                const int dum = 1; //Correct. Just not making it a class variable

};

Предположим, в основном, я делаю это:

int main()
{
        dummy d;
        d.dum = 1; //Illegal!

        std::cout<<"Printing dum from object: "<<d.dum<<std::endl;
        std::cout<<"Printing dum from class: "<<dummy::dum<<std::endl;

        return 0;
}

Хотя static было легко понять, const испорчен в c ++. Следующий ресурс помогает лучше понять его: http://duramecho.com/ComputerInformation/WhyHowCppConst.html

0
Aparna

Const означает «не может быть изменено».

Статический означает «статический экземпляр (в памяти) vs динамический экземпляр (в стеке.)» Статические переменные существуют на протяжении всей программы. Динамические создаются и уничтожаются по мере необходимости.

Переменная может быть одна или обе.

0
Kiki Jewell

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

0
user266117

const означает константу, и их значения определяются во время компиляции, а не явно меняются во время выполнения, значение константы не может быть изменено во время выполнения

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

Для получения дополнительной информации о статических переменных см. здесь

0
manugupt1