Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Кроме того, с С++ 0x до С++ 11 использование ключевого слова static было устаревшим для объявления объектов в области пространства имен. Это отклонение было удалено на С++ 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

С++

Имеет ту же самую семантику, что и в коротком ответе. Кроме того, нет параметров, определяющих static s.

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
}

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

Ответ 3

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

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

Константные переменные:

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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 и С++, бессмысленно объявлять статические глобальные переменные, но они очень полезны в функциях и классах. В управляемых языках единственным способом получить глобальную переменную является объявление ее как статического.

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

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

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

Подробнее о статических переменных см. здесь

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

Const означает "нельзя изменить".

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

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

Ответ 15

  статическая

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

Пример:

#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;
}

Это напечатало бы: Печать дум с объекта: 1 Печать из класса: 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

Ответ 16

static is a storage specifier.
const is a type qualifier.

Ответ 17

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