Static в си: Пока смерть не разлучит нас или всё о static в C++ / Хабр

Статические члены (C++) | Microsoft Learn

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

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

Статические данные-члены не входят в состав объектов указанного типа класса. В результате объявление статических данных-члена не является определением. Данные-член объявляются в области видимости класса, однако определение выполняется в области видимости файла. Такие статические члены имеют внешнюю компоновку; Проиллюстрируем это на примере.

// static_data_members.cpp
class BufferedOutput
{
public:
   // Return number of bytes written by any object of this class.
   short BytesWritten()
   {
      return bytecount;
   }
   // Reset the counter.
   static void ResetCount()
   {
      bytecount = 0;
   }
   // Static member declaration.
   static long bytecount;
};
// Define bytecount in file scope.
long BufferedOutput::bytecount;
int main()
{
}

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

На статические данные-члены можно ссылаться без указания ссылок на объект типа класса. Число байтов, записываемых с помощью объектов BufferedOutput, можно получить следующим образом.

long nBytes = BufferedOutput::bytecount;

Для того чтобы существовал статический член, не обязательно, чтобы существовали любые объекты типа класса. Доступ к статическим членам также можно получить с помощью операторов выбора элементов (. и ->). Пример:

BufferedOutput Console;
long nBytes = Console.bytecount;

В предыдущем случае не ссылка на объект (Console) не вычисляется; возвращается значение статического объекта

bytecount.

Статические данные-члены подчиняются правилам доступа члена класса, поэтому закрытый доступ к ним допускается только для функций и дружественных объектов класса-члена. Эти правила описаны в разделе Контроль доступа участника. Имеется исключение: статические данные-члены должны быть определены в области видимости файла, вне зависимости от их ограничений доступа. Если данные-член необходимо инициализировать явным образом, инициализатор должен быть предоставлен в определении.

Тип статического члена не квалифицируется его именем класса. Таким образом, тип — BufferedOutput::bytecountlong.

Классы и структуры

Static функции в C — Stack Overflow на русском

Вопрос задан

3 года 4 месяца назад

Изменён 3 года 4 месяца назад

Просмотрен 2k раза

Не могу до конца понять смысл static функций. Я понимаю, что оно ограничивает видимость, но ведь она и так изначально ограничена. И я не могу вызвать функцию из другой единицы, если не объявил ее изначально в текущей единице трансляции. При этом, static функцию я все равно не могу указывать в *.h файле, и ее приходится объявлять в *.c файлах.

Получается, что и так и так, объявление локальных функций приходится делать в *.c и вызвать ее оттуда, без явного намерения (объявить в *.h или объявить extern) не получится. Зачем тогда

static? Чтобы перестраховываться от этого?

  • c
  • функции
  • static

static не имеет никакого отношения к видимости вообще. Видимость — свойство идентификатора, на которое static не оказывает никакого влияния.

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

Ваши рассуждения на тему «могу объявить» или «не могу объявить» не совсем ясны. К функции с внешним

связыванием вы всегда можете прилинковаться из другой единицы трансляции — достаточно просто выполнить ее объявление. К функции с внутренним связыванием (т.е. static-функции) вы прилинковаться из другой единицы трансляции никак не сможете. Разница налицо.

Также объявление функций как static дает компилятору исчерпывающее знание о всех контекстах вызова этой функции, что существенно повышает его возможности по оптимизации кода. (Известный интереснейший пример, в том числе существенно опирающийся на свойства static: Why undefined behavior may call a never-called function)

10

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Колодочный тормоз состоит из шарнирно соединенного рычага и фрикционной колодки в точке B .

Коэффициент статического трения между колесом и рычагом равен µs = 0,3, а к колесу приложен крутящий момент 5 Н·м. Определите, может ли тормоз удерживать колесное колесо, когда сила, применяемая к рычагу, составляет (a) p = 30n, (b) P = 70 N.

Литература Guidescept unpresseruting Руководство по учебнику по учебнику в средней школе. МатематикаАлгебраИсчислениеГеометрияВероятностьСтатистикаТригонометрияНаукаПродвинутая физикаАнатомия и физиологияБиохимияБиологияХимияНауки о ЗемлеЗдоровье и питаниеСестринское делоФизикаСоциальные наукиАнтропологияГеографияИсторияПолитологияПсихологияСоциология

Learn

Напишите

плюс

Log In

Международное издание — Инженерная механика: статика, 14-е издание (единица SI)

14th Edition

ISBN: 978013918922

Awor Издатель: PEARSON

Не помогло? См. похожие книги

INTERNATIONAL EDITION — Engineering Mechanics: Static, 14th edition (SI unit)

Трение. 8P

Глава 8.2, Проблема 8P

Колодочный тормоз состоит из рычага с шарнирным соединением и фрикционной колодки B . Коэффициент статического трения между колесом и рычагом равен

мк с = 0,3, а к колесу приложен крутящий момент 5 Н·м. Определите, может ли тормоз удерживать колесо в неподвижном состоянии, когда усилие, приложенное к рычагу, равно (a) P = 30 Н, (b) P = 70 Н.

См. решение. решениеОзнакомьтесь с образцом решения из учебника

04:48

Предыдущий

ГЛАВА 8.2, Проблема 7P

. 5 50505059.9005 9000 505050507 503 5 50507 5 9. 5 9 9 2 9 2 9

. 9

. 9.
9

. 9 9. шарнирно соединенных рычага и фрикционного блока в точке B. Коэффициент трения покоя между колесом и рычагом µs = 0,3, к колесу приложен крутящий момент 5 Н·м. Определить, может ли тормоз удерживать колесо в неподвижном состоянии, когда сила, приложенная к рычагу, равна: а) Р = 30 Н, б) Р = 70 Н. Нарисуйте схему свободного тела рычага.

Вал имеет винт с квадратной резьбой с шагом 8 мм и средним радиусом 15 мм. Если он находится в контакте с пластинчатой ​​шестерней со средним радиусом 30 мм, определите момент сопротивления М на пластинчатой ​​шестерне, который можно преодолеть, если к валу приложить крутящий момент 7 Н·м. Коэффициент статического трения на винте µB =0,2. Трением подшипников, расположенных в точках A и B, пренебречь.

Латунный диск радиусом 0,7 фута-фута и весом 459 фунтов-фунтов находится в гранитной канавке под прямым углом. Диск контактирует с канавкой в ​​точках AA и BB, а коэффициент трения покоя в обеих точках равен µS=µS=0,39.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *