Константы, определённые с помощью const, освобождают своё пространство после выхода за пределы их области видимости, тогда как статические константы, определённые с помощью static, не освобождают своё пространство хранения после выполнения функции.
static означает статический. Статические функции-члены и статические переменные-члены класса связаны с классом, а не с конкретными объектами класса. Даже без конкретного объекта можно вызывать статические функции-члены и переменные-члены класса. Обычно статическая функция класса почти является глобальной функцией, за исключением того, что её область видимости ограничена файлом, содержащим её.
В C++ статические переменные-члены нельзя инициализировать внутри класса. Внутри класса находится только объявление; определение должно быть вне тела определения класса, обычно инициализируется в файле реализации класса, например:double Account::Rate = 2.25;
Ключевое слово static можно использовать только в объявлении внутри тела определения класса; при определении его нельзя помечать как static.
В C++ константные переменные-члены также нельзя инициализировать при определении класса; их можно инициализировать только через список инициализации конструктора, и при этом конструктор должен существовать.
Член данных const является константным только в течение времени жизни конкретного объекта, но для всего класса он переменный. Поскольку класс может создавать несколько объектов, разные объекты могут иметь разные значения своих членов данных const. Поэтому члены данных const нельзя инициализировать в объявлении класса, потому что, когда объект класса ещё не создан, компилятор не знает, каково значение члена данных const.
Инициализацию const-членов данных можно выполнять только в списке инициализации конструктора класса. Чтобы создать константу, которая является константной для всего класса, следует использовать enum-константу в классе или static const.
Основное назначение константных функций-членов — запретить функциям-членам изменять содержимое объекта. То есть константная функция-член не может изменять значения переменных-членов, но может обращаться к переменным-членам. Когда функция-член вызывается для константного объекта, эта функция может быть только константной функцией-членом.
Основное назначение статических функций-членов — служить глобальными функциями в области видимости класса. Они не могут обращаться к нестатическим данным-членам класса. Статические функции-члены класса не имеют указателя this, что приводит к следующему:
- 1. Не могут напрямую обращаться к нестатическим переменным-членам класса или вызывать нестатические функции-члены.
- 2. Не могут быть объявлены как virtual.
Об инициализации членов static, const, static const и const static
1. Инициализация членов const в классе:
При создании const в классе нельзя задать ему начальное значение.
2. Инициализация статических членов в классе:
Статические переменные в классе принадлежат классу, а не конкретному объекту. У них есть только одна копия на протяжении всего выполнения программы. Поэтому их нельзя инициализировать при определении объекта; то есть их нельзя инициализировать с помощью конструктора. Правильный способ инициализации:
data type class name::static data member name = value;
Это означает:
- 1. Инициализация выполняется вне тела класса, и static не добавляется впереди, чтобы избежать путаницы с обычными статическими переменными или объектами.
- 2. При инициализации не добавляйте спецификаторы доступа члена, такие как private, public, и т. д.
3. Инициализация членов static const и const static в классе
Эти два способа записи дают одинаковый эффект. Для простоты запоминания здесь объясняется только один общий способ инициализации:
Полный пример
Пример
Место инициализации
Статические элементы не могут быть инициализированы в определении класса (кроме int). Они не могут быть инициализированы в заголовочном файле.
Например, если определён myclass.h, он обычно инициализируется в myclass.cpp.
Статические члены классов C++ (static)
Статические члены предлагаются для решения проблемы совместного использования данных. Существует много способов обеспечить совместное использование, например, один из методов — задание глобальных переменных или объектов. Однако глобальные переменные или объекты имеют ограничения. В этой главе мы в основном рассматриваем использование статических членов класса для совместного использования данных.
Статический член данных
В классе статические члены позволяют обеспечить совместное использование данных между несколькими объектами, а использование статических членов данных не нарушает принцип сокрытия, тем самым обеспечивая безопасность. Следовательно, статические члены — это члены, совместно используемые всеми объектами класса, а не члены конкретного объекта.
Использование статических членов данных может экономить память, поскольку они являются общими для всех объектов. Поэтому для нескольких объектов статические члены данных хранятся только в одном месте и совместно используются всеми объектами. Значение статического члена данных одинаково для каждого объекта, но его значение может обновляться. Как только значение статического члена данных обновляется один раз, всем объектам гарантируется доступ к одному и тому же обновлённому значению, что повышает эффективность по времени.
Правила использования и меры предосторожности для статических членов данных приведены ниже:
1. При определении или объявлении статического члена данных добавьте ключевое слово static в начале.
2. Инициализация статических членов отличается от инициализации обычных членов данных. Формат инициализации статических членов данных следующий:
<data type><class name>::<static data member name>=<value>
Это означает:
- (1) Инициализация выполняется вне тела класса, и static не добавляется в начале, чтобы избежать путаницы с обычными статическими переменными или объектами.
- (2) При инициализации не добавляйте спецификаторы управления доступом члена, такие как private, public и т. д.
- (3) При инициализации используйте оператор разрешения области видимости, чтобы указать класс, которому он принадлежит. Следовательно, статические члены данных являются членами класса, а не членами объекта.
3. Статические элементы данных хранятся статически; они имеют статическое время жизни и должны быть инициализированы.
4. При обращении к статическому элементу данных используйте следующий формат:
<class name>::<static member name>
Если разрешение доступа статического элемента данных позволяет (т. е. он является открытым членом), к статическому элементу данных можно обращаться в программе, используя приведённый выше формат.
Ниже приведён пример, иллюстрирующий применение статических элементов данных:
Пример
Из вывода видно, что значение Sum одинаково для объекта M и объекта N. Это потому, что при инициализации объекта M значения трёх int-членов данных объекта M суммируются и присваиваются Sum, поэтому Sum хранит это значение. При инициализации объекта N значения трёх int-членов данных объекта N суммируются и затем прибавляются к существующему значению Sum, поэтому Sum будет хранить новое значение. Следовательно, значение, на которое ссылаются через объект M или объект N, одно и то же, а именно 54.
Статическая функция-член
Как и статические данные-члены, статические функции-члены являются статическими членами класса; они не являются членами объекта. Поэтому для обращения к статическим членам не требуется использовать имя объекта.
В реализации статической функции-члена нельзя напрямую обращаться к нестатическим членам, объявленным в классе, но можно обращаться к статическим членам, объявленным в классе. Если статической функции-члену нужно обратиться к нестатическим членам, она может сделать это через объект. Следующий пример иллюстрирует это.
Пример
Читатели могут сами проанализировать результат. Видно, что вызов статической функции-члена использует следующий формат:
<class name>::<static member function name>(<parameter list>);
Способы инициализации различных типов переменных-членов в C++
Различные типы членов в C++ имеют разные способы инициализации в зависимости от того, являются ли они статическими или const. Синтаксис Java не настолько сложен; неудивительно, что так много людей идут изучать Java. Раньше меня спрашивали об этом на собеседовании, и я не мог ответить. При написании кода я часто всё путал. Здесь я просмотрел книгу и обобщил это.
Некоторые переменные-члены имеют специальные типы данных, и способы их инициализации также отличаются от переменных-членов обычных типов данных. К таким специальным типам переменных-членов относятся:
- a. Константные переменные-члены
- b. Ссылочные переменные-члены
- c. Статические переменные-члены
- d. Целочисленные статические константные переменные-члены
- e. Нецелочисленные статические константные переменные-члены
Для константных переменных-членов и ссылочных переменных-членов инициализация должна выполняться через список инициализации конструктора. Присваивание значений константным переменным-членам и ссылочным переменным-членам внутри тела конструктора не представляется возможным.
Инициализация статических переменных-членов также довольно специфична.
См. следующий код и комментарии к нему:
C++ сводка по статическим членам, C++, static
Впоследствии я глубоко обдумал это и решил тщательно обобщить ключевые моменты о статических членах класса, чтобы в будущих собеседованиях не быть пассивным в таких вопросах.Статические члены класса включают две части: статические члены данных и статические функции-члены.
Статические члены данных
Статический член данных
1. Определение статических элементов данных.
Статические элементы данных на самом деле являются глобальными переменными в области видимости класса. Поэтому определение (инициализацию) статических элементов данных не следует размещать в заголовочных файлах. (Объявление vs. определение (инициализация)) Способ их определения такой же, как у глобальных переменных. Пример:
Файл
Не пытайтесь определять (инициализировать) статические элементы данных в заголовочных файлах. В большинстве случаев это вызовет ошибки, такие как повторное определение. Даже если добавитьили#ifndef #define #endifэто всё равно не сработает.#pragma once2. Статические элементы данных являются общими для всех объектов класса, включая объекты производных классов этого класса. То есть объекты производного класса и объекты базового класса совместно используют статические элементы данных базового класса. Пример:
// Объявление
// Верно, _staticVar — статический элемент данных
// Верно, статический элемент данных
Значение статического элемента данных можно законно изменить в константной функции-члене. Пример:
// функция-член const
Статическая функция-член
1. Адрес статической функции-члена можно сохранить в обычном указателе на функцию, тогда как адрес обычной функции-члена нужно сохранять в указателе на функцию-член класса. Пример:
// Обычный указатель на функцию
3. Статические функции-члены не могут быть одновременно объявлены как virtual, const или volatile. Пример:
// Ошибка
Автор: SDMrFeng
Оригинал: https://blog.csdn.net/tobefxz/article/details/14109697
Pycharm: импорт пакетов и модулей Python