Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098

Static члены класса

05.01.2016, 08:43. Показов 9430. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

есть класс, например

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
point
{ 
public:
    float x;
    float y;
 
    static distance (point A, point B) 
    {
        float dx = A.x - B.x;
        float dy = A.y - B.y;
        return sqrt(dx*dx + dy*dy);
    } 
}
static получается совместно разделяемым, те будет выделена память под distance один раз и все объекты point будут этой функцией пользоваться?
Например:
C++
1
2
3
4
point A;
point B;
cout << A.distance(A,B);
cout << B.distance(A,B);// будет использоваться одна функ в 1-ом и 2-ом случае, те одна область памяти?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2016, 08:43
Ответы с готовыми решениями:

класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции)
Помогите пожалйуста с реализацией программы... Реализовать класс «Строка» (данные-члены класса – строчка (указатель на массив, ...

Static члены классов
Доббрый день. Хочу решить следующую задачу: посчитать количество сравнений, которое делает qsort. Для этого, как мне видится можно...

Static член класса
Всем привет! Подскажите, пожалуйста, почему так писать нельзя: В хедере объявляю статический метод: public: explicit...

70
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2016, 21:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mr.X Посмотреть сообщение
и если на них с этой точки зрения посмотреть, то логики мы в них увидим меньше.
Где меньше? Везде говорится, что методы являются собственностью, то есть поддерживают отношение владения. Но они не находятся в... И это же логично. Зачем бы это дублировать код? Доступ к членам экземпляра происходит через указатель this, но тот, кто получает доступ к не членам их тоже сможет модифицировать. Сможет и без this. Это не только внутреннего к функции статического члена касается, ведь. Вы можете поменять любой статический член функцией членом, так же как и глобальную переменную. Язык позволяет стать науши, но нигде не написано, что это нужно делать, так же как и нигде это не запрещено делать категорически. Жизнь привлекает всех различными сторонами.

Добавлено через 7 минут
Цитата Сообщение от hoggy Посмотреть сообщение
вы сказать то что хотели?
Хех... Специально для вас и в последний раз. Когда человек задаёт вопрос, а потом не читая ответов вываливает пол главы из книги, со словами: - "Вот всё элементарно", это его характеризует. Не стану вам больше отвечать, если вы не станете исследовать логику моих ответов. Предлагаю как договор.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 21:26
Цитата Сообщение от Mr.X Посмотреть сообщение
Но в С++ совсем не так. Там говорят - слишком жирно каждому Мужику по отдельной Руке.
только если так было задумано.
ведь ничто не мешает сделать каждому по руке.

если проводить аналогию с объектами реального мира,
то статики удобно иллюстрировать на муравейнике.
каждый муравей - отдельный юнит,
но в то же время, все муравьи друг с другом
связаны какими невидимыми телепатическими связями.

вот что бы организовать подобные "телепатические связи",
можно задействовать локальные статики,
или статические члены.

я хочу сказать, что статики сами по себе никак не мешают моделировать
различные элементы реального мира.

просто их не нужно пихать туда, где они не нужны.
причем ни в техническом плане,
ни в плане представления объекта реального мира.

Добавлено через 6 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Специально для вас и в последний раз.
я думал, вот сейчас последует конкретика.
а там опять вода.

такое впечатление, то ли вы сами не знаете что хотели сказать.
то ли просто пишите лишь бы что нибудь написать.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Когда человек задаёт вопрос, а потом не читая ответов вываливает пол главы из книги, со словами: - "Вот всё элементарно", это его характеризует.
а это что такое? какие то ваши фантазии?

а то может быть у меня амнезия,
и верно, вы меня сейчас ткнете носом в конкретно сообщение,
где я сначала задавал вопросы,
а потом не читая ответов вывалил половину главы из некоторой книги.
заодно вы мне конечно скажите,
из какой конкретно книги я чего то там вывалил.

Добавлено через 6 минут
Цитата Сообщение от ct0r Посмотреть сообщение
Есть причины, по которым вызов статической функции через нулевой указатель, вполне можно считать well-defined.
глянул.
не обнаружил причин полагать конструкцию well-defined.
то, что UB в отдельных случаях может работать,
и тот факт, что разработчики платформы могут
прозрачно для пользователей использовать
где нибудь в недрах библиотеки конструкции,
являющиеся UB по стандарту,
не является основанием полагать конструкцию well-defined
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2016, 21:33
Цитата Сообщение от hoggy Посмотреть сообщение
из какой конкретно книги я чего то там вывалил.
Речь шла о TC а не о вас. Кстати, о муравьях я как раз писал. Если создать класс муравейник и включить в него муравья, то многие статические члены станут собственностью муравейников. Муравьи муравейника "У коренастого дуба" и муравьи муравейника "У старого пня" смогут общаться не мешая друг другу. Актуальная тема?
Но остаётся общий лес, и если и его создать, то будет лесной массив, район, область, страна, континент... То есть всегда придётся иметь какие-то статические данные от сущности которую данная программа не представляет в виде объектов.
Не люблю разговоров из серии "У меня в ушах бананы". За сим постараюсь не вмешиваться больше.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.01.2016, 21:35
Цитата Сообщение от hoggy Посмотреть сообщение
не обнаружил причин полагать конструкцию well-defined.
Я обнаружил. Там все расписано. И не подразумеваются никакие отдельные случаи или реализации. Только стандарт, в самой общей что ни на есть форме.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 21:45
Цитата Сообщение от ct0r Посмотреть сообщение
Там все расписано. И не подразумеваются никакие отдельные случаи или реализации. Только стандарт, в самой общей что ни на есть форме.
ещё раз перечитал. не нашел.
нашел массу упоминаний с ссылками на стандарт, что сие есть UB.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.01.2016, 22:20
Цитата Сообщение от hoggy Посмотреть сообщение
ещё раз перечитал. не нашел.
Тогда объясняю кратко:
a->b() == (*a).b()
*a само по себе - это не UB. Эта тема уже обсуждалась, ее не поднимаем.
(*a).b() - не UB, потому что по-прежнему нигде значение *a не используется и никаких преобразований не выполняется:
In some contexts, an expression only appears for its side effects. Such an expression is called a discarded-value
expression. The expression is evaluated and its value is discarded.
For static member functions, the implicit object parameter is considered to match any
object (since if the function is selected, the object is discarded). [ Note: No actual type is established for
the implicit object parameter of a static member function, and no attempt will be made to determine a
conversion sequence for that parameter (13.3.3). — end note ]
Где я ошибаюсь?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2016, 22:51
Цитата Сообщение от ct0r Посмотреть сообщение
Где я ошибаюсь?
Нигде не ошибаетесь
Но :
N3242 - §9.4/2
A static member may be referred
to using the class member access syntax, in which case the object-expression is evaluated
Конечно вами приведённая сноска - работает, должна работать но это скорее нужно воспринимать как исключение из правил и лучше о нём забыть.
Как вы точно подметили:
Цитата Сообщение от ct0r Посмотреть сообщение
Не все так просто.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 23:01
Цитата Сообщение от ct0r Посмотреть сообщение
*a само по себе - это не UB. Эта тема уже обсуждалась, ее не поднимаем.
UB.

5 Expressions

11
In some contexts, an expression only appears for its side effects. Such an expression is called a discarded-value
expression. The expression is evaluated and its value is discarded.
сначала компилятор вычисляет выражение,
и только затем оптимизирует.

сначала UB, а затем... а затем уже никто ничего не гарантирует.

13.3.1 Candidate functions and argument lists
4
For non-static member functions, the type of the implicit object parameter is
— “lvalue reference to cv X” for functions declared without a ref-qualifier or with the & ref-qualifier
— “rvalue reference to cv X” for functions declared with the && ref-qualifier
where X is the class of which the function is a member and cv is the cv-qualification on the member
function declaration. [ Example: for a const member function of class X, the extra parameter is assumed to
have type “reference to const X”. — end example ] For conversion functions, the function is considered to
be a member of the class of the implied object argument for the purpose of defining the type of the implicit
object parameter. For non-conversion functions introduced by a using-declaration into a derived class, the
function is considered to be a member of the derived class for the purpose of defining the type of the implicit
object parameter. For static member functions, the implicit object parameter is considered to match any
object (since if the function is selected, the object is discarded). [ Note: No actual type is established for
the implicit object parameter of a static member function, and no attempt will be made to determine a
conversion sequence for that parameter (13.3.3). — end note ]
при вызове статической функции-члена экземпляр никак не используется.
ну это как бе итак понятно.
однако, сути не меняет.

стандарт сказал:
разыменовывание нулевого указателя есть UB.

стандарт сказал:
доступ по указателю суть разыменовывание указателя.

что в последствии будет происходить с результатом выражения (*ptr) - монопенисуальный фактор,
если UB уже приключилось.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.01.2016, 23:09
Цитата Сообщение от hoggy Посмотреть сообщение
UB.
Цитата Сообщение от hoggy Посмотреть сообщение
стандарт сказал:
разыменовывание нулевого указателя есть UB.
Нет, там нет такого. Если бы было, то все было б ясно как божий день. А на данный момент там - неоднозначность, которая трактуется разными людьми по-разному. Поэтому спорить на эту тему я не буду.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.01.2016, 00:47
Цитата Сообщение от ct0r Посмотреть сообщение
Нет, там нет такого. Если бы было, то все было б ясно как божий день. А на данный момент там - неоднозначность, которая трактуется разными людьми по-разному.
все там есть.
в частности, однозначно сказано:
this должен указывать на объект, для которого была вызвана функция-член.

одного этого достаточно, что бы однозначно понимать,
что доступ к членам класса по нулевому указателю есть UB.

и кстати, не очень то интересно,
что по этому поводу думаете вы, или я.

гораздо интереснее, как ситуацию трактуют компиляторы.

например, знаменитый баг в ядре линукса,
когда компилятор оптимизировал проверку:

C++
1
2
3
4
*ptr;  //<--- нельзя разыменовывать нулевые указатели
 
if(ptr) do1(); //<--- значит проверка избыточна
else do2();
итого, компилятор оптимизировал до:
C++
1
do1();

Цитата Сообщение от ct0r Посмотреть сообщение
Поэтому спорить на эту тему я не буду.
на самом деле это скучноватая тема.

вся её суть сводится к двум вещам:
1.
здесь UB, и я так писать не буду.

2.
здесь неоднозначность,
а значит код, как минимум плохо пахнет.
и так писать я так же не буду.

полагаю, что подобного рода холиварные темы не имеют практической ценности.
потому что на практике проще писать нормальный код,
и не создавать проблем ни себе, ни людям.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
07.01.2016, 11:19
Цитата Сообщение от hoggy Посмотреть сообщение
this должен указывать на объект, для которого была вызвана функция-член.
Только у статической функции-члена вообще нету никакого this, о чем тоже однозначно сказано

Цитата Сообщение от hoggy Посмотреть сообщение
гораздо интереснее, как ситуацию трактуют компиляторы.
например, знаменитый баг в ядре линукса,
когда компилятор оптимизировал проверку:
Ну ядро-то не на С++, а на С Разница в том, что с сями все как раз понятно, их стандарт ясно говорит:
If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined
...
Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer, an address inappropriately aligned for the type of object pointed to, and the address of an object after the end of its lifetime.
Цитата Сообщение от hoggy Посмотреть сообщение
полагаю, что подобного рода холиварные темы не имеют практической ценности.
потому что на практике проще писать нормальный код,
и не создавать проблем ни себе, ни людям.
Ты помнишь наши с тобой холивары, которые имели практическую ценность?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.01.2016, 11:37
Лучший ответ Сообщение было отмечено SergioO как решение

Решение

Цитата Сообщение от ct0r Посмотреть сообщение
Только у статической функции-члена вообще нету никакого this, о чем тоже однозначно сказано
монопенисуальный фактор.
this должен смотреть на объект в момент разыменовыния указателя.

Цитата Сообщение от ct0r Посмотреть сообщение
Ты помнишь наши с тобой холивары, которые имели практическую ценность?
конкретно с вами:
не помню точно, что именно, но помню, что что-то полезное было.

а вообще, я из разных холиваров узнал не меньше, чем из книг.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
07.01.2016, 11:45
Цитата Сообщение от hoggy Посмотреть сообщение
this должен смотреть на объект в момент разыменовыния указателя.
Я упорно не могу понять, откуда ты берешь this.
In the body of a non-static (9.3) member function, the keyword this is a prvalue expression whose value
is the address of the object for which the function is called.
this существует только в теле функции-члена и только если она не статическая. Как ты получил this для статической функции - для меня загадка

Цитата Сообщение от hoggy Посмотреть сообщение
а вообще, я из разных холиваров узнал не меньше, чем из книг.
Меня прикалывает, когда думаешь, что уж это-то очевидно, просто и понятно всем, а потом оп! облом
1
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
07.01.2016, 14:01  [ТС]
посмотрел еще лекцию Лекция по С++. Static, почитал сообщения в данной теме, за что всем участникам благодарен, и с Божьей помощью разобрался. На практике, скорее всего, вопросы еще будут, но на данный момент вопросов больше не имею.
IGPIGP, копировал кусок ранее в сообщения я не для себя, а для такого же новичка, который так же "ткнется" в этот вопрос и ссылка на видео выше тоже не для меня и не для вас. не отвечал на сообщения это не значит не читал.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
07.01.2016, 15:51
hoggy
If the pointer is a null pointer value (4.10 [conv.ptr]) or points one past the last element of an array object (5.7 [expr.add]), the result is an empty lvalue
Это дополнение было принято в 2005 году кажется.

Разыменование нулевого указателя не является неопределённым поведением. Так как при обращении к статическому методу вычисленное при разыменовании значение отбрасывается, то обратиться через null pointer к статическому члену возможно.

Добавлено через 6 минут
P.S. Если у Вас на руках есть принятый стандарт C++11, то там наверняка подобное или эквивалентное дополнение есть. У меня только draft.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.01.2016, 15:51
Цитата Сообщение от mporro Посмотреть сообщение
Это дополнение было принято в 2005 году кажется.
я не знаю, что такое "дополнение".

1.
в документе:
ISO/IEC JTC1 SC22 WG21 N 3690
Date: 2013-05-15
ISO/IEC CD 14882
ISO/IEC JTC1 SC22
Secretariat: ANSI
нет ничего похожего на вашу цитату.

2.
мне не понятна фраза вырванная из контекста.
что за результат такой: "пустое значение" ?
результат чего?

вот есть у меня некий произвольный класс.
что значит "empty lvalue" для этого класса?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
07.01.2016, 15:53
hoggy
Тем не менее утверждается, что есть. Ибо в 2005 году принято. Точка.

У Вас на руках с высокой вероятностью ошибочный документ. Проверьте в самом начале, есть ли там фраза про пример с dereference the null point. Если есть, то этот документ не действителен, в нём есть ряд прямых противоречий, нужно купить новый.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.01.2016, 15:56
Цитата Сообщение от mporro Посмотреть сообщение
Тем не менее утверждается, что есть. Ибо в 2005 году принято. Точка.
земля плоская, и стоит на трех слонах. точка.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.01.2016, 16:04
Цитата Сообщение от SergioO Посмотреть сообщение
IGPIGP, копировал кусок ранее в сообщения я не для себя, а для такого же новичка, который так же "ткнется"
Думаете есть бедолаги у кого не хватает мотивации или удачи книжку открыть?
SergioO, посмотрите сколько написано в надежде, что вы это прочтёте. Это примерно аж до этих пор:
Static члены класса
(странно, почему иной раз ссылка, на пост в этом же топике (?!) выполненная стандартным "копировать ярлык" потом не работает?)
То есть я даже не о том, что вы (героически) выложили здоровущий фрагмент из внешнего источника, а о вашем комментарии к нему:
Цитата Сообщение от SergioO Посмотреть сообщение
По-моему, даже комментировать нечего - все предельно ясно.
или вот ещё знаковый фрагмент:
Цитата Сообщение от SergioO Посмотреть сообщение
блин, правда чистая, Кнутт или Сэджвик с их математикой и алгоритмами никаких проблем не вызывают, но долбаный "интуитивно понятный" синтаксис бесит.
Но тут не вы один такой. А бог не при чём. Это я вам как атеист говорю.
Желаю вам пересмотреть отношение к жизни иначе время потратите впустую (имхо).
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
07.01.2016, 16:26
hoggy
Действительно комитет C++11 не ввёл разыменование для nullpointer, мотивируя какими-то сложностями низкого уровня.

Приношу извинения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2016, 16:26

Static-член класса
Подскажите пожалуйста в чем проблема, не получается инициализировать static-член указатель на объекты класса. counter инициализируется...

Static поля класса
объясните нубу, вот имею я такой код на С# class WebResponse { public static string GET(string Url, string Data) ...

Static в описании метода класса
всем привет. что такое static в описании метода класса или самого класса. что такое статичный метод? что такое не статичный метод?

Статические методы класса (static)
Доброго времени суток! Читаю &quot;Решение сложных задач С++ - Саттер&quot;, у него есть такая задача: вы хотите написать шаблон класса MyClass,...

Инициализация static члена класса
Добрый вечер! Есть класс, в нём в private реализован ещё один + это всё шаблоны. Во вложенном классе есть static указатель на переменную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
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 на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru