Различие между помехами в C и статичный в C++??

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

>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
>>> x
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> x.T
array([[ 1,  4,  7, 10],
       [ 2,  5,  8, 11],
       [ 3,  6,  9, 12]])
52
задан dave 26 November 2014 в 09:16
поделиться

4 ответа

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

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

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

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

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

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

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

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

И хотя она устарела, это не меняет своей семантики сейчас .

83
ответ дан 7 November 2019 в 09:15
поделиться

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

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

namespace
{
    int file_scope_x;
}

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

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

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

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

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

14
ответ дан 7 November 2019 в 09:15
поделиться

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

Но 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;
9
ответ дан 7 November 2019 в 09:15
поделиться

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

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

Процитируем Приложение D стандарта:

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

6
ответ дан 7 November 2019 в 09:15
поделиться