260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||
1 | |||||||||||
Static члены класса05.01.2016, 08:43. Показов 7832. Ответов 70
Метки нет (Все метки)
Здравствуйте.
есть класс, например
Например:
0
|
05.01.2016, 08:43 | |
Ответы с готовыми решениями:
70
класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции) Static члены классов Static член класса Static-член класса |
05.01.2016, 09:06 | 2 |
В любом случае ф-ция-член класса существует в программе в единственном экземпляре, на зависимо от того static она или нет. Отличие static от не static ф-ции в том, что не static имеет скрытый (от программиста) параметр - адрес вызывающего объекта (внтури ф-ции это this).
1
|
Комп_Оратор)
|
||||||
05.01.2016, 20:09 | 3 | |||||
SergioO, между static и именем метода должно быть float или double по логике. Вообще, создавая статический член имеет смысл ответить на вопрос "Почему я не могу без него обойтись". Нестатический метод выглядел бы так:
Если у класса заводится много статических членов, то имеет смысл подумать, а не просится ли на свет охватывающий класс.
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||||||||||||
05.01.2016, 20:40 [ТС] | 4 | ||||||||||||||||||||
например, есть у нас
Добавлено через 4 минуты да, пропустил, но сути не меняет не уловил мысль... я вообще не понимаю зачем этот статик. в случае библиотек понятно когда они статические, а в классах зачем? на простом примере можете пояснить?
0
|
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
|
||||||
05.01.2016, 20:45 | 5 | |||||
Мне кажется странным это утверждение, т.к. у меня была такая штука
По идее к статик членам и методам можно обращаться как SmClass::megaStaticFunc();
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
05.01.2016, 20:48 [ТС] | 6 |
еще вопрос возник (чтоб тем не плодить новых здесь его задам, тк рядом все по смыслу):
читаю Страуструпа С++ 2011г. издание: и далее
0
|
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
|
|
05.01.2016, 20:58 | 7 |
"Спецификатор static указывает компилятору на хранение локальной переменной во время всего жизненного цикла программы вместо ее создания и разрушения при каждом входе в область действия и выходе из неё. Следовательно, возведение локальных переменных в ранг статистических позволяет поддерживать их значения между вызовами функций."
"В языке C++ использование спецификатора ststic для данных-членов класса приводит к созданию только одной копии этих членнов, совместно используемой всеми объектами класса." http://ic.asf.ru/~/docs/cpp/cppd_qualifier.htm
0
|
Комп_Оратор)
|
|
06.01.2016, 00:09 | 8 |
это и есть причина почему статический метод не может иметь доступ к нестатическим полям конкретного экземпляра. Указатель на экземпляр ему неизвестен. Подумав Вы должны понять фразу:
Ваш пример с плотной группой статических членов вполне работоспособен. Однако нужно понимать, что класс в котором определены только статические поля тоже статичен. Его экземпляры неотличимы друг от друга, а их создание не имеет смысла, так как всё и так доступно через класс, как вы правильно говорите, - через оператор доступа к пространству имен класса (типа). Статические члены класса и статические переменные роднит то, что они создаются вначале и умирают в конце программы. То есть, доступ к ним возможен ещё до создания любого экземпляра. Можно считать, что статическая переменная класса, это глобальная статическая переменная, "прикрытая" именем класса. Это позволяет определять подобные вещи если они нужны классу и не бояться конфликта имён. Но нужно помнить, что разбиение экземпляров на подгруппы по значению такой переменной, в принципе, не возможно, так как она меняется сразу для всех. Этим утрачивается всё преимущество инкапсуляции, для которой и создавались классы (они создавались, исторически, для реализации распределённых вычислений). То есть, при большом количестве тематически (логически) связанных статических членов, лучше создать класс который содержит их как нестатические и включить в него экземпляр класса в котором Вы избавляетесь от статических полей, например. Но пока это не важно. Последние сентенции как раз об этом. и об этом. С точки зрения логики, это выглядит как наличие супер категории. Включить в экземпляр вы её не можете, а обойтись без, - тоже. Вот пример. Вы описываете класс. Учебный класс. У вас есть данные которые являются собственностью учащегося - имя, фамилия, дата рождения, оценки и т.п. Но у вас есть данные которые в рамках описываемой программы меняться не будут. Это данные школы: номер школы, адрес школы и т.д.. Задав их статическими Вы получите профит в том, что все и всегда будут иметь доступ к таким вещам непосредственно. Их не нужно инициализировать при создании экземпляров, их не нужно копировать при копировании и т.п. Проблемы начинаются тогда, когда в программе (в результате её развития)) нужно описать несколько школ. То есть, налицо необходимость создания супер класса. Или вот ещё пример. Внутри класса есть две категории: - мальчики и девочки. В каждой группе пол имеет признак супер категории. Он глобален для группы (предполагаем, что по крайней мере в школьном возрасте, операции по смене пола ещё не возможны). Иначе говоря, невозможно изменить данное значение в созданном экземпляре. Но тем не менее существуют две группы и поэтому статическая переменная уже не решает задачи. Налицо необходимость создания супер класса. Супер класс, это моя отсебятина в терминологии и никакого отношения к наследованию не имеет. Ну то есть имеет, но это тут не затронуто. И не надо пока.
0
|
06.01.2016, 04:53 | 9 | |||||
А как то, что я написал связано с тем, что ты показал?
Еще простой пример, чтоб стало понятней
0
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|
06.01.2016, 06:14 | 10 |
Статический член-данных класса не принадлежит объекту, память для такого члена выделяется не в объекте класса, а в статической памяти, поэтому на размер объекта не влияет, и поэтому же, для статического члена-данных класса, память нужно выделять отдельно (т.к., при создании объекта под него ничего не выделяется).
1
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
06.01.2016, 06:52 [ТС] | 11 |
сейчас не буду искать где, но читал что "->" - и есть оператор разыменования, те a->f(); = (a*).f();
может я и не прав, но сейчас проверять не буду. После того, как начал тему, я не сидел сложа руки и кое-что "накопал". Процитирую, чтоб здесь было, тк кому еще такой вопрос придется искать на форуме. Добавлено через 6 минут вопрос: а сколько памяти должно выделиться в данном случае? вроде ж еще не известно. скорее всего надо либо вне класса структуру статик объявлять с глобал видимостью или в классе но тогда фиксить статиком структуру default_day. щас попробую в IDE, чтоб развеять сомнения и отпишусь. Добавлено через 1 минуту про компоновку внешнюю и внутреннюю ничего не понял... это имеется в виду компоновка после(или при) компиляции?
0
|
06.01.2016, 06:57 | 12 | ||||||||||
При линковке, пример
мы с разных колоколен к вопросу подходим
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||
06.01.2016, 07:21 [ТС] | 13 | ||||||||||
При попытке скомпилировать такое
Добавлено через 8 минут каких "колоколен", пока еще леса за деревьями не видно...
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
06.01.2016, 07:53 [ТС] | 15 |
0
|
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|||||||||||
06.01.2016, 07:54 | 16 | ||||||||||
Элементарно, Ватсон! При вызове статической функции f через объект-переменную, ссылку или указатель выражения
0
|
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||||||||||||
06.01.2016, 11:07 [ТС] | 17 | ||||||||||||||||||||
и
создается же экземпляр default_date класса Date и создается он статически, те доступен для всех экземпляров класса и ... нафиг он вообще нужен и почему в классе создается тот же самый класс, но статически... ничего опять не понимаю... обложишься всякими книжками, а там ведь нифига не объясняется, просто какие-то малопонятные примеры и дальше поехали. про это все дружно, начиная со трупа страуса забыли упомянуть. ах, да, это ж так банально объясняя про классы привести пример:
есть какая нормальная книга может про это или видео? смотрел технистрим(мэйл.ру) тоже ни о чем. char *ch; это указатель на символ, а *ch - это разыменование указателя и тд
0
|
Комп_Оратор)
|
|
06.01.2016, 11:28 | 18 |
SergioO, дело даже не в том, что Вы не понимая зачем статик показываете, что не понимаете зачем не статик (то есть саму суть объектного подхода) с достаточной ясностью, чтобы понять отличие. Гораздо хуже то, что Вы не понимаете, что не ищете этого понимания. Примером является то, как Вы знакомитесь со static. Вместо того, чтобы решить:
Вы углубляетесь в нюансы рекурсивных определений. Да, класс не может содержать себя как поле, но он может содержать указатель на себя, статический член своего типа... Но это не связано с сутью статической переменной. Можно предположить, что поля экземпляра и функции члены Вы учили используя сходный подход. Тут надо что-то делать, - Вы теряете время. *** Представьте, что объект это маленькая часть кода. Представьте, что мы не знаем классов и объектов. Тогда то, что реализуется двумя разными объектами, нужно реализовывать повторяя код два раза, но с разными исходными данными. Предположим, что мы не используем повторение за счёт вызовов общего кода (функций и итераций), а повторяем его механически (копипастом)). Теперь ясно, что данные которые должны быть видны обоим фрагментам, лучше объявить в охватывающей области видимости. В случае объектного подхода, это и будут статические данные. Отсюда все их свойства: незнание объекта, видимость для всех объектов. И отсюда и дилемма: - "А нужен ли в данной задаче охватывающий объект?". Дело в том, что идя по пути перманентного строительства охватывающих классов, можно остановиться лишь на описании точки - супер прото-частицы за момент до начала большого взрыва. То есть, в конкретной задаче нужно где-то остановиться не греша "заделами на будущее". Вместе с тем, для описания реального объекта необходимо существование супер категории хотя бы в единственном экземпляре. Это значит, что данные будут присутствовать в виде статических членов, либо глобальных переменных. Второе это просто плохо. Таким образом статические данные это нормальная часть жизни.
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||||||||||||
06.01.2016, 11:37 | 19 | |||||||||||||||
нужно будет создать static Date и пошёл дальше парсить код. Как все классы и cpp`шники распарсил - читает свои заметки про статик поля, про extern`ал переменные и про необходимые шаблоны классов.Итого: 1) встретив static Date внутри Date он же "недочитал" еще весь класс - но заметку сделал.2) увидив extern int i; , он же незнает информацию совсех cpp есть ли там где-то глобальный int i = 10; - но сделал заметку перепроверить.3) нашёл шаблоный класс template <typename T> class Foo{}; он же незнает всех Т для данной программы? - но сделал заметку засекать и выписывать все Т, чтобы потом копипастить как бог.что это поле СТАТИЧЕСКОЕ! (с) ваш_капитан Легко:
Искажённый вариант для ТСа:
Да, char* - это указатель на переменную char. "d" - содержит адресс, указывающий на адресс ячейки типа char. (за слово ячейка мне сейчас глаза выклюют). А никто не говорит, что это must-have фича. Кому надо тот использует! Кому нет - не использует.
0
|
06.01.2016, 11:58 | 20 |
Добавлено через 4 минуты По делу - налицо полное непонимание происходящего. Советую пока отложить static в сторонку и разобраться как классы хранятся (хранятся ли?) в памяти, а также объекты, члены, ф-ции члены. Что происходит при создании объекта, что при разрушении и т.д.
1
|
06.01.2016, 11:58 | |
06.01.2016, 11:58 | |
Помогаю со студенческими работами здесь
20
Static поля класса Static в описании метода класса Статические методы класса (static) Инициализация static члена класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |