когда/почему я должен использовать статику в С++?

Я нашел Почему/когда я должен объявлять переменную, используя static?, но теги относятся к target-c .

Я не могу убедиться, есть ли какая-либо разница в деталях использования между С++ и Objective-C, когда вы используете статику, поэтому, когда и почему я должен использовать статику в С++?


person Point wind    schedule 09.10.2018    source источник
comment
Когда вы хотите, чтобы ваш объект жил на протяжении всего жизненного цикла вашей программы, когда вам не нужен экземпляр, когда вам нужна вспомогательная функция и т. д., и т. д. Тема слишком широкая.   -  person Ron    schedule 09.10.2018
comment
related/dupe: stackoverflow.com/questions/15235526/   -  person NathanOliver    schedule 09.10.2018
comment
у вас есть конкретный случай? можешь показать код? что я действительно не понимаю в этом вопросе, так это то, что для большинства применений static вы не можете просто добавить или удалить его, не нарушая другой код или полностью не изменяя значение переменной, т.е. это решение, которое вы принимаете заранее, а не тогда, когда переменная уже находится в место   -  person 463035818_is_not_a_number    schedule 09.10.2018


Ответы (1)


static имеет несколько независимых значений, в зависимости от контекста.

void f() { ... }
static void g() { ... }

Здесь f имеет «внешнюю связь», что означает, что его имя видно в других единицах перевода. То есть в другом исходном файле у вас может быть void f();, а затем вы можете вызвать функцию f.

g, с другой стороны, поскольку он помечен static, имеет "внутреннюю связь". Вы можете вызвать его из кода в том же исходном файле, но вы не можете вызвать его из другого исходного файла.

То же самое для объектов:

int i = 3;        // external linkage
static int j = 4; // internal linkage

И небольшая сложность: вы можете определить статический объект внутри функции.

void f() {
    static int i = 3;
    std::cout << i << '\n';
    ++i;
}

Здесь i не имеет нет связи. Это видно только внутри функции. Он инициализируется при первом вызове функции (и вообще не инициализируется, если функция не вызывается). Таким образом, при первом вызове f в консоль будет записано «3». При втором вызове он напишет «4» и т. д. Понимание поведения объектов с деструкторами оставляем читателю в качестве упражнения.

Внутри определения класса все совершенно по-другому.

class C {
public:
    void f();
    static void g();
    int i;
    static int j;
};

Здесь, когда вы вызываете f, вы должны вызывать его для объекта типа C, а f может использовать элементы данных этого объекта, то есть он может просматривать и изменять как i, так и j. Когда вы вызываете g, нет связанного объекта. Он по-прежнему является членом C, поэтому может просматривать и изменять j, поскольку j тоже не связан ни с одним объектом. Есть только один j, и он используется всеми объектами типа C.

person Pete Becker    schedule 09.10.2018
comment
Вы можете захотеть предоставить случай, когда переменная static находится внутри функции. - person Thomas Matthews; 09.10.2018
comment
@ThomasMatthews - хорошая идея. Сделанный. - person Pete Becker; 09.10.2018