Статические члены (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
) не вычисляется; возвращается значение статического объекта
.
Статические данные-члены подчиняются правилам доступа члена класса, поэтому закрытый доступ к ним допускается только для функций и дружественных объектов класса-члена. Эти правила описаны в разделе Контроль доступа участника. Имеется исключение: статические данные-члены должны быть определены в области видимости файла, вне зависимости от их ограничений доступа. Если данные-член необходимо инициализировать явным образом, инициализатор должен быть предоставлен в определении.
Тип статического члена не квалифицируется его именем класса. Таким образом, тип — BufferedOutput::bytecount
long
.
Классы и структуры
Static функции в C — Stack Overflow на русском
Вопрос задан
Изменён 3 года 4 месяца назад
Просмотрен 2k раза
Не могу до конца понять смысл static
функций.
Я понимаю, что оно ограничивает видимость, но ведь она и так изначально ограничена.
И я не могу вызвать функцию из другой единицы, если не объявил ее изначально в текущей единице трансляции. При этом, static
функцию я все равно не могу указывать в *.h
файле, и ее приходится объявлять в *.c
файлах.
Получается, что и так и так, объявление локальных функций приходится делать в *.c
и вызвать ее оттуда, без явного намерения (объявить в *.h
или объявить extern
) не получится.
Зачем тогда
? Чтобы перестраховываться от этого?
- c
- функции
- static
static
не имеет никакого отношения к видимости вообще. Видимость — свойство идентификатора, на которое static
не оказывает никакого влияния.
Объявление функции как static
придает ей внутреннее связывание, то есть ограничивает ее линкуемость из других единиц трансляции. Все ссылки на static
-сущности обычно разрешаются на стадии компиляции и в генерируемом объектном файле не упоминаются вообще, т.е. линкер даже и не знает об их существовании. В частности, нет никакой необходимости беспокоиться о глобальных конфликтах имен при объявлении статических функций.
Ваши рассуждения на тему «могу объявить» или «не могу объявить» не совсем ясны. К функции с внешним
связыванием вы всегда можете прилинковаться из другой единицы трансляции — достаточно просто выполнить ее объявление. К функции с внутренним связыванием (т.е.static
-функции) вы прилинковаться из другой единицы трансляции никак не сможете. Разница налицо.Также объявление функций как static
дает компилятору исчерпывающее знание о всех контекстах вызова этой функции, что существенно повышает его возможности по оптимизации кода. (Известный интереснейший пример, в том числе существенно опирающийся на свойства static
: Why undefined behavior may call a never-called function)
10
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Колодочный тормоз состоит из шарнирно соединенного рычага и фрикционной колодки в точке 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 . Коэффициент статического трения между колесом и рычагом равен
См. решение. решениеОзнакомьтесь с образцом решения из учебника
Расписание 04:48
CHEVRON_LEFT
Предыдущий CHEVRON_LEFT
ГЛАВА 8.2, Проблема 7P
CHEVRON_RINGE
. 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.