|
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|||||||||||
Static члены класса05.01.2016, 08:43. Показов 9435. Ответов 70
Метки нет (Все метки)
Здравствуйте.
есть класс, например
Например:
0
|
|||||||||||
| 05.01.2016, 08:43 | |
|
Ответы с готовыми решениями:
70
класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции)
Static член класса |
|
Комп_Оратор)
|
||
| 06.01.2016, 13:17 | ||
|
-какие задачи решают объекты; -как данные задачи решаются без объектов; -зачем нужны статические переменные. То есть, я хочу сказать, что не понимая на уровне алгоритмических определений вроде: "Это такая штука которая делает зашебись..." не стоит вникать в конструктив: "Это такая штуковина, которая устроена так-то и так-то". Не будет интересно и обучение станет мучением. Бесполезным, причем, что уж совсем неприемлемо.
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||||||||||||||||||
| 06.01.2016, 16:32 | |||||||||||||||||||||||||||||||||||||||
|
более того:
несмотря на то, что экземпляр для этого не нужен, и само по себе разыменовывание в этом случае не имеет смысла. а все потому, что в стандарте сказано: при доступе по указателю, сначала разыменовываем, потом думаем:
для тех, кто до сих пор не въехал в природу статических/не статических функций членов объясняю: вот есть обычные "свободные функции" :
просто они объявлены в пространстве имени класса, автоматически являются другом класса, и на них распространяется действие модификатора доступа public/protected/private никаких других синтаксических отличий не существует. в техническом смысле, статические-функции-члены имеют абсолютно точно такую же природу, как и самые обычные свободные. пример:
просто нужно явно указывать имя класса при доступе к статической-функции-члену в чем киллер фича? ну например, нам нужна обычная свободная функция, но при этом мы хотим запретить вызывать её снаружи. вызывать её имеют только экземпляры класса. это можно было бы сделать вот так:
я не буду подробно заостряться на этом. разберем лучше не статические-функции-члены. первое, что нужно понять новобранцу: технически, природа функций-членов идентична свободным. и существуют они в программе так же в единственном экземпляре. сначала предлагаю задуматься над единством экземпляра функции: функция содержит исполняемый код. она реализует некоторый алгоритм обработки чего либо. рассмотрим пример:
каждый хранит свое состояние: содержимое переменной v. значение данных-членов может быть уникально для разных экземпляров класса. поэтому каждый экземпляр содержит свою собственную копию данных-членов в своей памяти. теперь смотрите на функцию-член foo: она абсолютно одинаковая для любого количества объектов. ну а зачем тогда каждому объекту хранить ещё и её? с данными-членами понятно - они могут быть уникальны для разных классов. а вот функции то одинаковы. поэтому, все функции-члены в памяти подобно свободным хранятся в единственном экземпляре. просто функция воздействует на тот или иной экземпляр а как определяется на какой? смотрим пример:
ну и в завершение, следующий пример иллюстрирует, что с технической точки зрения, функции-члены - те же самые "свободные функции". http://rextester.com/RPP97113
что для того, что бы провернуть трюк, пришлось обмануть компилятор, и обойти его защиту. "не спроста ведь компилятор пытался не допустить этого!" - верно подумал внимательный читатель, и не напрасно. дело в том, что в стандарте не указанно, как именно следует доставить информацию в метод об объекте, на который нужно воздействовать. существуют различные "соглашения о вызовах" (загуглите сами) но даже они не являются панацеей. компиляторы вольны здесь проворачивать любую магию. с другой стороны, методы могут быть виртуальным, унаследованными, и тд и тп. все что касается преобразований функций-членов - туманная сторона с++, где стандарт так и не пришел ещё к общему знаменателю. и существует множество нюансов. в общем, рассматривайте пример-иллюстрацию, как поясняющую "суть вещей", но не вздумайте бездумно кастить методы к свободным функциям" спички детям не игрушки.
3
|
|||||||||||||||||||||||||||||||||||||||
|
Комп_Оратор)
|
||
| 06.01.2016, 17:18 | ||
|
А моё дело в том, что поднятая тема ценна сама по себе. Что касается ТС как такового, то ему само слово static ещё не в прок. А вопрос может быть интересен многим, вот я и выложил свою интерпретацию. Кому-то может и понравится. ТСу это пока бессмысленно объяснять. Вот пост где ему всё ясно без пояснений: Static члены класса Тут нечего добавить. Ваши размышления о том, что функции они функции и есть, кстати, к теме вообще не относятся, но вас же это не смущает? Вы входите в тему и всё рассказываете. Под занавес. Ну и что? Имеете полное право.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 06.01.2016, 18:23 | |||
|
на самом деле мне знакомы сомнения-размышлизмы ТС, потому что когда то я и сам чем то подобным озадачивался. статические члены класса воспринимаются, как "собственность всего класса", в то время, как не статические члены, как "собственность конкретного объекта". из-за чего возникает иллюзия, что функции-члены существуют где то в объекте класса. в последствии, я встречал подобное не логичное, и ошибочное мнение у многих новичков. и у всех у них сабж вызывал сомнения. вообще то, первый же ответ ТС`у, который привел господин Kastaneda - предельно четкий, лаконичный и точный. однако, к сожалению, понять его сможет лишь тот, кто уже в теме. я лишь дополнил ответ господина Kastaneda, раскрыв подноготную материала. выдавая столь же точные, сколь и лаконичные, столь и бесполезные для новичка ответы, то приведенный вами ответ - это выдержка из обучающего материала. эта тема возникла не сегодня. и на самом деле изначально я не хотел сюда писать. потому что мой изначальный ответ был бы в духе: "взять в руки букварь, и просто прочитать тему про статические члены класса не судьба? или обязательно нужно скопипастить сюда целый абзац из какой нибудь книги?" но это было бы не конструктивно. и все таки, я написал дополнение к ответу господина Kastaneda раскрыв сабж с технической точки зрения (в букварях он раскрывается с точки зрения синтаксиса языка), в расчете, что это окончательно расставит все точки над "и".
0
|
|||
|
Комп_Оратор)
|
||||
| 06.01.2016, 18:55 | ||||
|
Static члены класса в надежде что вы прочтёте этот пост. В нём ТС приводит цитату и говорит, что в ней ему всё ясно без комментариев. Он там цитирует и Kastaneda, в самом начале, но это не важно. Но это - фаза, возрастное... и со временем оно проходит. Однако, есть ещё более тяжёлые заблуждения. Серьёзные (и не только с виду) люди говорят о статических членах, отваживаясь давать им нравственную оценку. Причем модно давать отрицательную. Слышны возгласы о нарушении инкапсуляции, замусоривании пространства класса, тем что экземпляру не принадлежит и пр. Н у то есть в классе де не должно быть общих "штурпаков", которые валяются под ногами как глобальные грабли. Ведь никто не знает кто последний и почему их модифицировал и т.д. и т.п. Я считаю, что давать оценки "хорошо-плохо" вещам, которые прочно вошли в жизнь надо осторожно. Мы же не детализируем класс до бесконечности. Степень детализации ограничивает поставленная задача. Вот и ходядят у нас студенты MyStudent имея только имя, фамилию, курс и ещё пару-тройку вещей. Вместо горячего завтрака и приличного жилья. Так и вышестоящие сущности не могут уходить вверх до бесконечности. Где-то нужно остановиться и в месте разрыва с реальностью сразу появятся "штурпаки", но висят они над головами. Как окорока и колбасы в подвале. И тут либо программист научится их принимать и любить, либо будет вечно биться о них головой. То есть ситуация всегда найдёт разрешение. Думаю, сказать об этом было уместно.
0
|
||||
|
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
|
||
| 06.01.2016, 19:07 | ||
|
Но и твой пример я не нахожу поясняющим суть статика. Т.к. если он работает, то он только покажет, что ОС будет сердится лишь в тех случаях, когда программа будет совсем наглеть, лезть руками в чужие карманы. Я это вижу как-то так. Кажется, кто-то тут писал, что этот пример UB. Я не знаю что такое UB, но думаю, что ничего хорошего.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 06.01.2016, 19:28 | |||||
|
о чем красноречиво продемонстрировал #4 и как это коррелирует с вашим предыдущим предложением. сам себе на свой вопрос ответил. очень мудрое решение: взять, да и почитать моральную обучающую литературу. это сообщение свидетельствует лишь о том, что для понимания сабжа, всех предыдущих ответов оказалось не достаточно, и ТС пришлось продолжать копать дальше. Добавлено через 7 минут неопределенное поведение. произойти может все, что угодно. и что именно - никто не знает, и не дает никаких гарантий. теоретически, мы можем получить стабильно работающую программу. а можем и открытку по почте от компилятора, или программу, которая будет работать в зависимости от фазы луны.
0
|
|||||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|||||||
| 06.01.2016, 19:42 | |||||||
0
|
|||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
| 06.01.2016, 19:49 | |
|
SergioO,
Для воистину крепкого понимания во что превращаются функции, код, переменные, статические, виртуальные. Нужно увидеть фразу "С/С++ - это кроссплатформенный асемблер". И загуглить и понять какую-то информацию по теме "структура программы на ассемблере" и увидеть что-то о сегментах. При этом не нужно становиться программистом ассемблера, а нужно получить представление "что куда и зачем".
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 06.01.2016, 19:52 | |||||||
|
я вижу статический объект, который существует в пространстве имени функции. а поскольку природа у всех функций одинаковая, то технически ничто мне не мешает сделать так:
то есть, это объекты, чьё время жизни - до конца программы. для меня в первую очередь очень логично, что это просто объект, способный выжить и сохранить состояние между вызовами функций. и когда я прочел об этом в книжке, я ничуть не удивился. ваша же логика мне живо напомнило Елену Сагалаеву, которая в своем блоге рекомендует не использовать локальные статики, потому что однажды она уже подорвалась на мине, следуя вашей нелогичной логике.
0
|
|||||||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
| 06.01.2016, 20:00 | |
|
Nosey, вы путаете стандарт и реализацию. Разработчики компилятора накропают ровно то, что написано в стандарте, хоть черта лысого. Надо просто стандарт читать. Хотя некоторым трудно представить абстракции стандарта, и они предпочитают мыслить их "в железе". Некоторые, например на полном серьезе считают, что указатель на член класса - это смещение адреса.
0
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 06.01.2016, 20:12 | |
|
0
|
|
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
| 06.01.2016, 20:17 | |
|
Mr.X,
Сегодня всё в С++ проще считать за абстракции. Мой комментарий был к тому, чтобы заметить разделённые области кода и данных, о том что код это последовательность команд процессору, если после этого у кого-то возникнет мысль что функция хранится в объекте - то лучше этому человеку забыть о с++ ) И да, стандарт плюсов асемблер не заменит, но без понимания во что превращается код из этого стандарта, гораздо сложнее осознать и запомнить почему сделано именно так. И выбирая между двух зол "указатель на член класса - это смещение адреса" и "метод класса хранится в объекте" я выберу первое
0
|
|
|
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
| 06.01.2016, 20:20 [ТС] | |
|
Nosey, это интересно пожалуй. я примерно об этом и думал. а ведь при компиляции какой-то ассемблерный файл получается и можно модифицируя его посмотреть? + есть же какие-то "просмотровщики" памяти? те, если написать простую прогу, откомпилировать, потом посмотреть asm затем глянуть в память (как там все это уместилось). есть же такая возможность? желательно что-нибудь под ubuntu
0
|
|
|
Комп_Оратор)
|
||||
| 06.01.2016, 20:24 | ||||
|
hoggy, вы часто не видите логики или не улавливаете мысль не находите?
0
|
||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||||||||
| 06.01.2016, 20:25 | ||||||||||||
И к исследуемой функции добавлять
0
|
||||||||||||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
| 06.01.2016, 20:35 | |
|
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||
| 06.01.2016, 20:43 | ||
|
http://stackoverflow.com/quest... ll-pointer http://stackoverflow.com/quest... fined-beha (последние абзацы)
1
|
||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 06.01.2016, 20:46 | ||
|
Вы рассматриваете классы и объекты как вещи в себе и Страуструпе, однако сам Страуструп создавал их для того, чтобы моделировать объекты реального мира, и если на них с этой точки зрения посмотреть, то логики мы в них увидим меньше. Пусть имеется класс Мужик, и у этого класса есть нестатическая функция Рука. Логично, что если Петя делает своей Рукой долговременную (статическую) заначку, то это будет одна заначка, а если Вася сделает своей Рукой статическую заначку, то это будет другая заначка. Но в С++ совсем не так. Там говорят - слишком жирно каждому Мужику по отдельной Руке. Рука будет одна общая, но в каждый момент будет действовать в интересах того, кто ее вызвал. Ежели ей дают команду почесать тестикулы, то чешет строго тому, на кого работает. Но с заначками начинаются проблемы. Вася общей рукой сделал заначку, а Петя этой же рукой - извлек ее же.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 06.01.2016, 20:49 | ||
|
0
|
||
| 06.01.2016, 20:49 | |
|
Static поля класса Static в описании метода класса
Инициализация static члена класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|