В чем разница между статической и константной функцией в C ++
главное отличие между статической и константной функцией в C ++ заключается в том, что Статическая функция позволяет вызывать функции, используя класс, без использования объекта, в то время как функц
Содержание:
главное отличие между статической и константной функцией в C ++ заключается в том, что Статическая функция позволяет вызывать функции, используя класс, без использования объекта, в то время как функция Constant не позволяет изменять объекты.
Ключевые области покрыты
1. Что такое статическая функция в C ++
— определение, функциональность
2. Что такое постоянная функция в C ++
— определение, функциональность
3. В чем разница между статической и константной функцией в C ++
— Сравнение основных различий
Основные условия
Статическая функция, постоянная функция, C ++
Что такое статическая функция в C ++
Рисунок 1: Статическая функция в C ++
В вышеприведенной программе есть класс MyClass. У него есть статическая функция, называемая fucntion1. В методе main программист может вызывать эту статическую функцию, используя имя класса и разрешение области действия, как в строке 16. При выполнении программы он выполняет статическую функцию и печатает инструкцию внутри этой функции на экране.
Что такое постоянная функция в C ++
Функция с ключевым словом «const» является постоянной функцией. Функция константы не позволяет изменять объекты и связанные элементы данных.
Рисунок 2: постоянная функция в C ++
Разница между статической и константной функцией в C ++
Определение
Ключевые слова
Статическая функция использует ключевое слово «static», тогда как постоянная функция использует ключевое слово «константа».
Элементы данных и функции
Кроме того, еще одно различие между статической и константной функциями в C ++ состоит в том, что статические члены-данные и статические функции-члены могут вызывать статические функции, тогда как любой тип объекта может вызывать постоянную функцию.
использование
Статические функции помогают вызывать функции с использованием класса без использования объектов, в то время как постоянные функции помогают избежать изменения объектов. Следовательно, это также различие между статической и константной функцией в C ++.
Заключение
В классе есть данные (члены-данные) и функции (функции-члены). Два типа функций-членов являются статическими и постоянными функциями. Основное различие между статической и константной функциями в C ++ состоит в том, что статическая функция позволяет вызывать функции с использованием класса, без использования объекта, тогда как функция константы не позволяет изменять объекты.
Ссылка:
1. «Типы функций-членов класса в C». Типы топологии сети в компьютерных сетях | Studytonight,
12.14 – Статические функции-члены
Статические функции-члены
В предыдущем уроке (12.13 – Статические переменные-члены) вы узнали, что статические переменные-члены являются переменными-членами, которые принадлежат классу, а не объектам класса. Если статические переменные-члены являются открытыми, мы можем получить к ним доступ напрямую, используя имя класса и оператор разрешения области видимости. Но что, если статические переменные-члены являются закрытыми? Рассмотрим следующий пример:
Как и статические переменные-члены, статические функции-члены не привязаны к какому-либо конкретному объекту. Вот приведенный выше пример со статической функцией-членом доступа:
Поскольку статические функции-члены не прикреплены к конкретному объекту, их можно вызывать напрямую, используя имя класса и оператор разрешения области видимости. Как и статические переменные-члены, они также могут вызываться через объекты класса, хотя это не рекомендуется.
У статических функций-членов нет указателя *this
Во-вторых, статические функции-члены могут напрямую обращаться к другим статическим членам (переменным или функциям), но не к нестатическим членам. Это связано с тем, что нестатические члены должны принадлежать объекту класса, а у статических функций-членов нет объекта класса, с которым можно было бы работать!
Еще один пример
Статические функции-члены также могут быть определены вне объявления класса. Это работает так же, как и для обычных функций-членов.
Эта программа печатает:
Обратите внимание: поскольку все данные и функции в этом классе статические, нам не нужно создавать экземпляр объекта класса, чтобы использовать его функциональные возможности! Этот класс использует статическую переменную-член для хранения значения следующего ID, который будет назначен, и предоставляет статическую функцию-член для возврата этого ID и его увеличения.
Предупреждение о классах со всеми статическими членами
Будьте осторожны при написании классов со всеми статическими членами. Хотя такие «чисто статические классы» (также называемые «моносостояниями») могут быть полезны, они также имеют некоторые потенциальные недостатки.
Во-вторых, из урока, посвященного глобальным переменным, вы узнали, что глобальные переменные опасны, потому что любой фрагмент кода может изменить значение глобальной переменной и в конечном итоге сломать другой, казалось бы, несвязанный фрагмент кода. То же самое верно и для чисто статических классов. Поскольку все члены принадлежат классу (а не объекту класса), а объявления классов обычно имеют глобальную область видимости, чисто статический класс, по сути, эквивалентен объявлению функций и глобальных переменных в глобально доступном пространстве имен со всеми недостатками, присущими глобальным переменным.
C++ не поддерживает статические конструкторы
Если вы можете инициализировать обычные переменные-члены с помощью конструктора, то, экстраполируя эту мысль, имеет смысл иметь возможность инициализировать статические переменные-члены с помощью статического конструктора. И хотя некоторые современные языки поддерживают статические конструкторы именно для этой цели, C++, к сожалению, не входит в их число.
Если для инициализации вашей статической переменной-члена требуется выполнение кода (например, цикла), существует множество различных, несколько странных способов сделать это. Один из способов, который работает со всеми переменными, статическими или нет, – это использовать лямбду и немедленно вызывать ее.
Следующий код представляет метод, который больше похож на обычный конструктор. Однако он немного сложнее, и, вероятно, вам это никогда не понадобится, поэтому, если хотите, можете пропустить оставшуюся часть этого раздела.
Резюме
Статические функции-члены в классе можно использовать для работы со статическими переменными-членами. Их не требуется вызывать именно через объект класса.
Можно создавать классы со всеми статическими переменными-членами и статическими функциями. Однако такие классы, по сути, эквивалентны объявлению функций и глобальных переменных в глобально доступном пространстве имен, и их обычно следует избегать, если у вас нет особо веских причин для их использования.
Что такое «статическая функция»?
вопрос был о простых функциях c, а не c++ static методы, как уточняется в комментариях.
11 ответов:
static функции-это функции, которые видны только другим функциям в том же файле (точнее тот же ЕП).
EDIT: для тех, кто подумал, что автор вопроса имел в виду метод класса: как вопрос с тегами C Он имеет в виду простую старую функцию C. For (C++ / Java/. ) методы класса, static означает, что этот метод может быть вызван на самого класса, а не экземпляра этого класса необходимый.
существует большая разница между статическими функциями в C и статическими функциями-членами в C++. В C статическая функция не видна за пределами своей единицы перевода, которая является объектным файлом, в который она скомпилирована. Другими словами, статичность функции ограничивает ее область действия. Вы можете думать о статической функции как о» частной » для ее *.C файл (хотя это не совсем правильно).
в C++ «статический» может также применяться к функциям-членам и членам данных классов. Один статический элемент данных также называется «переменной класса», в то время как нестатический элемент данных является»переменной экземпляра». Это терминология Smalltalk. Это означает, что существует только одна копия статического члена данных, которые используются всеми объектами класса, в то время как каждый объект имеет собственную копию нестатический член данных. Таким образом, статический член данных по существу является глобальной переменной, то есть членом класса.
нестатические функции-члены могут получить доступ ко всем данным-членам класса: статические и нестатический. Статические функции-члены могут работать только со статическими элементами данных.
один из способов подумать об этом заключается в том, что в C++ статические члены данных и статические функции-члены принадлежат не какому-либо объекту, а всему классу.
есть два варианта использования ключевого слова static, когда речь заходит о функциях в C++.
во-первых, необходимо отметить функцию как имеющую внутреннюю связь, чтобы на нее нельзя было ссылаться в других единицах перевода. Его использование не рекомендуется в C++. Для этого использования предпочтительны безымянные пространства имен.
второе использование находится в контексте класса. Если класс имеет статическую функцию-член, это означает, что функция является членом класса (и имеет обычный доступ к другие члены), но его не нужно вызывать через определенный объект. Другими словами, внутри этой функции нет указателя «this».
минимальный запускаемый многофайловый пример
главная.c:
сборник:
выход:
толкование
как обычно, чем меньше объем, тем лучше, поэтому всегда объявляйте функции static если вы можете.
в программировании на C файлы часто используются для представления «классов» и static функции представляют собой «частные» методы класса.
общий шаблон C должен передать a this структура вокруг как первый аргумент «метода», который в основном то, что C++ делает под капотом.
о чем говорят стандарты это
С99 проект N1256 6.7.1 «спецификаторы класса хранения» говорит, что static является «спецификатором класса хранения».
6.2.2 / 3″ связи идентификаторов » говорит static подразумевает internal linkage :
если объявление идентификатора области видимости файла для объекта или функции содержит описатель класса хранения static, идентификатор имеет внутреннюю связь.
и 6.2.2/2 говорит, что internal linkage ведет себя как в наш пример:
в наборе единиц перевода и библиотек, составляющих целую программу, каждое объявление определенного идентификатора с внешней связью обозначает один и тот же объект или функцию. В пределах одной единицы трансляции каждое объявление идентификатора с внутренней связью обозначает один и тот же объект или функцию.
как GCC реализует его для ELF (Linux)?
С STB_LOCAL привязка.
если мы компилируем:
и разберите таблицу символов с помощью:
локальные символы STB_LOCAL не видны за пределами объектного файла, содержащего их определение. Локальные символы с одинаковым именем могут существовать в нескольких файлах, не мешая друг другу
когда редактор ссылок объединяет несколько перемещаемых объектных файлов, он не позволяет использовать несколько определений stb_global символов с одинаковым именем.
что согласуется с ошибками связи на нескольких нестатических определениях.
см. также
попробуйте сами
Если у вас есть только один файл, то этот модификатор не имеет абсолютно никакого значения. Разница заключается в больших проектах с несколькими файлами:
В C, каждый «модуль» (комбинация образца.C и образец.h) компилируется независимо, а затем каждый из этих скомпилированных объектных файлов (пример.o) связаны вместе с исполняемым файлом компоновщиком.
вот почему вы делаете эту функцию, которая используется только внутри, статической функцией. В этом случае компилятор не создает типичный флаг»вы можете связать эту вещь» для компоновщика, так что компоновщик не видит эту функцию и не будет генерировать ошибку.
определения статических функций помечают этот символ как внутренний. Таким образом, он не будет виден для связывания извне, а только для функций в том же блоке компиляции, обычно в том же файле.
статическая функция-это функция, которая может быть вызвана для самого класса, в отличие от экземпляра класса.
например нестатический будет такой:
этот метод работает на экземпляре класса, а не на самом классе. Однако вы можете иметь статический метод, который может работать без экземпляра. Это иногда используется в Заводском шаблоне:
Minor nit: статические функции видны единице перевода, которая для большинства практических случаев является файлом, в котором определена функция. Ошибка, которую вы получаете, обычно называется нарушением правила одного определения.
стандарт, вероятно, говорит что-то вроде:
» каждая программа должна содержать ровно одно определение каждой неинлайн функция или объект, который используется в этой программе; диагностики требуемый.»
Это способ C смотреть на статические функции. Это, однако, рекомендуется использовать в C++.
В C++, кроме того, можно объявить функции-члены, статические. Это в основном метафункции, т. е. они не описывают/изменяют поведение/состояние конкретного объекта, а действуют на весь класс. Кроме того, это означает, что вам не нужно создавать объект для вызова статической функции-члена. Кроме того, это также означает, что вы получаете доступ только к статическим членам переменные в рамках такой функции.
Я бы добавил к примеру Parrot одноэлементный шаблон, который основан на такого рода статической функции-члена, чтобы получить/использовать один объект в течение всего срока службы программы.
ответ на статическую функцию зависит от языка:
1) в языках без OOPS, таких как C, это означает, что функция доступна только в файле, где она определена.
для статической функции в» c » compiller не будет создавать свои внутренние переменные в стеке, поэтому вызов статической функции выполняется быстрее, и, как следствие, вы не можете использовать инициализаторы, такие как: char c=’A’.
Всем привет. На одном из код-ревью я столкнулся с мыслью, что многие, а чего скрывать и я сам, не то чтобы хорошо понимаем когда нужно использовать ключевое слова static. В данной статье я хотел бы поделиться своими знаниями и информацией по поводу ключевого слова static. Статья будет полезна как начинающим программистам, так и людям, работающим с языком С++. Для понимания статьи у вас должны быть знания о процессе сборки проектов и владение языком С/С++ на базовом уровне. Кстати, static используется не только в С++, но и в С. В этой статье я буду говорить о С++, но имейте в виду, что всё то, что не связано с объектами и классами, в основном применимо и к языку С.
Что такое static?
Где используется?
Ниже приведена схема, как и где используется static в программе.
А теперь я постараюсь детально описать все то, что изображено на схеме. Поехали!
Статические переменные внутри функции
Если не использовать static в строке 4, выделение памяти и инициализация переменной count происходит при каждом вызове функции counter(), и уничтожается каждый раз, когда функция завершается. Но если мы сделаем переменную статической, после инициализации (при первом вызове функции counter()) область видимости count будет до конца функции main(), и переменная будет хранить свое значение между вызовами функции counter().
Статические объекты класса
В строке 3 мы создаем класс Base с конструктором (строка 5) и деструктором (строка 8). При вызове конструктора либо деструктора мы выводим название метода класса в консоль. В строке 14 мы создаем статический объект obj класса Base. Создание этого статического объекта будет происходить только при первом вызове функции foo() в строке 18.
Из-за того, что объект статический, деструктор вызывается не при выходе из функции foo() в строке 15, а только при завершении программы, т.к. статический объект разрушается при завершении программы. Ниже приведен пример той же программы, за исключением того, что наш объект нестатический.
Если мы уберем static при создании переменной в функции foo(), то разрушение объекта будет происходить в строке 15 при каждом вызове функции. В таком случае вывод программы будет вполне ожидаемый для локальной переменной с выделенной памятью на стеке:
Статические члены класса
В сравнении с предыдущими вариантами использования, статические члены класса немного сложнее для понимания. Давайте разберемся, почему. Предположим, у нас есть следующая программа:
В нашем примере мы создали класс А (строка 3) и класс В (строка 9) со статическими членами класса (строка 15). Мы предполагаем, что при создании объекта b в строке 19 будет создан объект a в строке 15. Так бы и произошло, если бы мы использовали нестатические члены класса. Но вывод программы будет следующим:
Причиной такого поведения является то, что статические члены класса не инициализируются с помощью конструктора, поскольку они не зависят от инициализации объекта. Т.е. в строке 15 мы только объявляем объект, а не определяем его, так как определение должно происходить вне класса с помощью оператора разрешения области видимости (::). Давайте определим члены класса B.
Теперь, после того как мы определили наш статический член класса в строке 18, мы можем увидеть следующий результат программы:
Constructor A
Constructor B
Destructor B
Destructor A
Нужно помнить, что член класса будет один для всех экземпляров класса B, т.е. если мы создали три объекта класса B, то конструктор статического члена класса будет вызван только один раз. Вот пример того, о чем я говорю:
Constructor A
Constructor B1
Constructor B2
Constructor B3
Destructor B3
Destructor B2
Destructor B1
Destructor A
Статические функции
Для того чтобы исправить данную проблему, одну из функций мы объявим статической. Например эту:
В этом случае вы говорите компилятору, что доступ к статическим функциям ограничен файлом, в котором они объявлены. И он имеет доступ только к функции sum() из math.cpp файла. Таким образом, используя static для функции, мы можем ограничить область видимости этой функции, и данная функция не будет видна в других файлах, если, конечно, это не заголовочный файл (.h).
Статические функции-члены класса (методы)
Статическую функцию-член вы можете использовать без создания объекта класса. Доступ к статическим функциям осуществляется с использованием имени класса и оператора разрешения области видимости (::). При использовании статической функции-члена есть ограничения, такие как:
В классе A в строке 8 у нас есть статическая функция-член foo(). В строке 14, мы вызываем функцию используя имя класса и оператор разрешения области видимости и получаем следующий результат программы:
Из вывода видно, что никакого создания объекта нет и конструктор/деструктор не вызывается.
Если бы метод foo() был бы нестатическим, то компилятор выдал бы ошибку на выражение в строке 14, т.к. нужно создать объект для того, чтобы получить доступ к его нестатическим методам.
Заключение
В одной статье в интернете я нашел совет от автора – «Используйте static везде, где только можно». Я хотел бы написать, почему так делать не стоит, а стоит использовать только в случае необходимости.
Урок №125. Статические методы класса
Обновл. 13 Сен 2021 |
На предыдущем уроке мы узнали, что статические переменные-члены — это члены, которые принадлежат классу, а не его объектам.
Статические методы
Если статические переменные-члены являются открытыми, то мы можем получить к ним доступ напрямую через имя класса и оператор разрешения области видимости. Но что, если статические переменные-члены являются закрытыми? Рассмотрим следующий код:
Подобно статическим переменным-членам, статические методы не привязаны к какому-либо одному объекту класса. Вот вышеприведенный пример, но уже со статическим методом:
Поскольку статические методы не привязаны к определенному объекту, то их можно вызывать напрямую через имя класса и оператор разрешения области видимости, а также через объекты класса (но это не рекомендуется).
Статические методы не имеют указателя *this
У статических методов есть две интересные особенности.
Во-первых, поскольку статические методы не привязаны к объекту, то они не имеют скрытого указателя *this! Здесь есть смысл, так как указатель *this всегда указывает на объект, с которым работает метод. Статические методы могут не работать через объект, поэтому и указатель *this не нужен.
Во-вторых, статические методы могут напрямую обращаться к другим статическим членам (переменным или функциям), но не могут напрямую обращаться к нестатическим членам. Это связано с тем, что нестатические члены принадлежат объекту класса, а статические методы — нет!
Еще один пример
Статические методы можно определять вне тела класса. Это работает так же, как и с обычными методами. Например:
Результат выполнения программы:
The next ID is: 1
The next ID is: 2
The next ID is: 3
The next ID is: 4
Обратите внимание, поскольку все переменные и функции этого класса являются статическими, то нам не нужно создавать объект этого класса для работы с ним! Статическая переменная-член используется для хранения значения следующего идентификатора, который должен быть ей присвоен, а статический метод — для возврата идентификатора и его увеличения.
Предупреждение о классах со всеми статическими членами
Будьте осторожны при написании классов со всеми статическими членами. Хотя такие «чисто статические классы» могут быть полезны, но они также имеют свои недостатки.
Во-первых, поскольку все статические члены создаются только один раз, то несколько копий «чисто статического класса» быть не может (без клонирования класса и его дальнейшего переименования). Например, если нам нужны два независимых объекта класса IDGenerator, то это будет невозможно через «чисто статический» класс.
Во-вторых, из урока о глобальных переменных мы знаем, что глобальные переменные опасны, поскольку любая часть кода может изменить их значения и, в конечном итоге, изменит другие фрагменты, казалось бы, не связанного с этими переменными кода (детально см. здесь). То же самое справедливо и для «чисто статических» классов. Поскольку все члены принадлежат классу (а не его объектам), а классы имеют глобальную область видимости, то в «чисто статическом классе» мы объявляем глобальные функции и переменные со всеми минусами, которые они имеют.
C++ не поддерживает статические конструкторы
Если вы можете инициализировать обычную переменную-член через конструктор, то по логике вещей вы должны иметь возможность инициализировать статические переменные-члены через статический конструктор. И, хотя некоторые современные языки программирования действительно поддерживают использование статических конструкторов именно для этой цели, язык C++, к сожалению, не является одним из таковых.








