Здравствуйте, Ash-2, Вы писали:
A2>Кто-нибудь может объяснить: чем статические функции в классах отличаются от обычных? A2>1. Есть мнение: "Каждый экземпляр класса содержит все элементы этого класса..." С данными все понятно, но функция — тоже элемент, т.е. если у меня 2 экземпляра класса, то должно быть два экземпляра функции (т.е. один и тот же код в памяти по разным адресам... бред...)
действительно бред.
A2>2. Есть другое мнение (нравится больше): A2>class A{ A2> void Fun(int i); A2>} A2>Функция Fun, заменяется компилятором на A2>void Fun(int i, A* pointer); A2>И соответственно при вызове передается только указатель на класс....
на самом деле все нестатические функции-члены имеют неявный первый параметр, имя которому this A2>НО, тогда непонятно чем отличается статическая функция, почему адрес этой функции известен на этапе компиляции и почему именно статическая "одна для всех экземпляров" (ведь и эта функция — одна)???
потому что это фактически обычная функция, не имеющая скрытых параметров, и просто "спрятанная" в пространстве имен класса.
A2>Спасибо за то, что дочитали до конца, ну а если еще и ответите...
Здравствуйте, Ash-2, Вы писали:
A2>Кто-нибудь может объяснить: чем статические функции в классах отличаются от обычных?
По крайней мере тем, что в нестатическую функцию при вызове неявно передается указатель на объект, для которого она вызвана, а в статическую — не передается.
A2>1. Есть мнение: "Каждый экземпляр класса содержит все элементы этого класса..." С данными все понятно, но функция — тоже элемент, т.е. если у меня 2 экземпляра класса, то должно быть два экземпляра функции (т.е. один и тот же код в памяти по разным адресам... бред...)
Вероятно, под элементами все же понимается переменные-члены. Тело функции (код) — одно и в том и в другом случае.
A2>НО, тогда непонятно чем отличается статическая функция, почему адрес этой функции известен на этапе компиляции и почему именно статическая "одна для всех экземпляров" (ведь и эта функция — одна)???
Адрес невиртуальной функции-члена также известен на этапе компиляции. В случае вызова виртуальной функции через указатель на базовый класс адрес вызываемой функции обычно неизвестен на этапе компиляции (потому, что на этапе компиляции может быть неизвестен конкретный тип объекта, на который указывает указатель).
А то, что она "одна для всех экземпляров", означает, что она не привязаня к какому-либо экземпляру класса. Т.е. внутри нее нет указателя this. Грубо говоря, она не принадлежит ни одному объекту.
Кто-нибудь может объяснить: чем статические функции в классах отличаются от обычных?
1. Есть мнение: "Каждый экземпляр класса содержит все элементы этого класса..." С данными все понятно, но функция — тоже элемент, т.е. если у меня 2 экземпляра класса, то должно быть два экземпляра функции (т.е. один и тот же код в памяти по разным адресам... бред...)
2. Есть другое мнение (нравится больше):
class A{
void Fun(int i);
}
Функция Fun, заменяется компилятором на
void Fun(int i, A* pointer);
И соответственно при вызове передается только указатель на класс....
НО, тогда непонятно чем отличается статическая функция, почему адрес этой функции известен на этапе компиляции и почему именно статическая "одна для всех экземпляров" (ведь и эта функция — одна)???
Спасибо за то, что дочитали до конца, ну а если еще и ответите...
В нестатический метод всегда неявно передается указатель на экземпляр класса, к которому этот метод применяется. В статический метод, дополнительных указателей не передается.
Здравствуйте, Ash-2, Вы писали:
A2>Кто-нибудь может объяснить: чем статические функции в классах отличаются от обычных? A2>1. Есть мнение: "Каждый экземпляр класса содержит все элементы этого класса..." С данными все понятно, но функция — тоже элемент, т.е. если у меня 2 экземпляра класса, то должно быть два экземпляра функции (т.е. один и тот же код в памяти по разным адресам... бред...)
A2>2. Есть другое мнение (нравится больше): A2>class A{ A2> void Fun(int i); A2>} A2>Функция Fun, заменяется компилятором на A2>void Fun(int i, A* pointer); A2>И соответственно при вызове передается только указатель на класс.... A2>НО, тогда непонятно чем отличается статическая функция, почему адрес этой функции известен на этапе компиляции и почему именно статическая "одна для всех экземпляров" (ведь и эта функция — одна)???
A2>Спасибо за то, что дочитали до конца, ну а если еще и ответите...
Второе верно примерно тока так void Fun(A* this, int i)
Насчет отличия нестатической от статической — экземляры данных существуют во множественном числе — сколько объектов класса — столько и экземпляров данных. Нестатические методы работают с экземплярами данных своего объекта. А статическая функция может работать только со статическими данными класса.
Здравствуйте, Ash-2, Вы писали:
A2>1. Есть мнение: "Каждый экземпляр класса содержит все элементы этого класса..." С данными все понятно, но функция — тоже A2>2. Есть другое мнение (нравится больше):
Кстати, откуда такие "мнения"? Может имеет смысл сменить источник информации на более внятный и правильный?
Посмотри топик Re: С чего начать?
Всем БОЛЬШОЕ СПАСИБО!!!
Особая благодарность Bell'у, за быстрый, лаконичный, полный ответ!
Михаилу Можаеву:
(источник) Если тебя это действительно интересует, но завтра дам полные библиографические данные книжки...
(Re: С чего начать?) Там кажется парню ничего проще VC++ 6.0 и .Net не посоветовали (если машина тянет)? Ну да... контролы, библиотеки всех мастей, программы из одного окна в 300-400Кб... а на вопрос: http://www.rsdn.ru/Forum/Message.aspx?mid=229552
Здравствуйте, Ash-2, Вы писали:
A2>(источник) Если тебя это действительно интересует, но завтра дам полные библиографические данные книжки...
Интересует, но достаточно будет имени автора и примерного названия книги
A2>(Re: С чего начать?) Там кажется парню ничего проще VC++ 6.0 и .Net не посоветовали (если машина тянет)?
Я имел в виду совершенно другой топик, даже дал на него прямую ссылку. Тот, что появился совсем недавно, просто имеет ту же тему Тогда повторю текст того топика, на который ссылался:
Сразу читать Страуструпа, наверное, тяжеловато. С места в карьер получается.
Для начала могу порекомендовать книгу
Стенли Б. Липпман, Жози Лажойе. Язык программирования С++. Вводный курс.
Ну а потом, конечно же, Страуструп. Причем 3-е или, еще лучше, специальное издание.
И еще несколько хороших книжек:
Скотт Мейерс — Эффективное использование С++
Скотт Мейерс — Наиболее эффективное использование С++
Герб Саттер — Решение сложных задач на С++ (в оригинале — Exceptional C++ и More Exceptional C++)