Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

Не обязательно разыменовывать указатель на функцию при вызове? - C++

23.02.2014, 03:44. Просмотров 279. Ответов 9
Метки нет (Все метки)

Здравствуйте.
Вот такой вопрос.

C++
1
2
3
4
5
6
7
8
void estimate(int lines, double (*pf) (int)); //прототип
// ...
void estimate(int lines, double (*pf) (int))
{
   using namespace std;
   cout << lines << " lines will take ";
   cout << (*pf)(lines) << " hour(s)\n";
}
Одинаковый результат при (*pf)(lines) и pf(lines). Почему?

И как, вообще, удобней по-вашему писать указатели? Например:
- int* pt;
- int * pt;
- int *pt.

Пока не начал учить ук-ли на ф-ии, писал как в первом варианте. Теперь начинаю сомневаться...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 03:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не обязательно разыменовывать указатель на функцию при вызове? (C++):

Указатель на функцию в вызове другой функции - C++
Всем доброе утро. У меня есть вот такая функция. double f(double x) { return x*x; } И мне нужно найти медиану в квадрате. Что я...

Преобразование типа при вызове виртуального метода через указатель на базовый класс - C++
Доброго времени суток. Наткнулся на вот такой вопрос в сети и пока что не смог на него ответить, может быть у Вас получится: В каких...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

Как передать целочисленный параметр в функцию по ссылке при рекурсивном вызове? - C++
void consonant_count(trie*root,trie*parent,int amount_of_consonant,bool found,int *c) { ...

Обязательно ли объявлять переменную для хранения адреса переменной как указатель? - C++
// Указатели #include &lt;iostream&gt; using namespace std; int Variable; int *pVariable; // int pVariable; int main() ...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель - C++
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); private: void echo_f (){}; ...

9
some_name
Вежливость-главное оружие
226 / 224 / 55
Регистрация: 19.02.2013
Сообщений: 1,441
23.02.2014, 03:58 #2

(*pf)(lines)
вызывает функцию , на которую указывает , с аргументами lines. Скобки вокруг *pf обязательны. Существует и другой, более простой, способ вызова функции с помощью указателя:

pf(lines);
Однако первый способ используется чаще (рекомендуем использовать именно его), потому что при втором способе вызова указатель *pf очень похож на имя функции, что может сбить с толку читающего программу. В то же время у первого способа записи есть свои преимущества, например, хорошо видно, что функция вызывается с помощью указателя на функцию, а не имени функции. Следует отметить, что первоначально в С был определен именно первый способ вызова.

Цитата Сообщение от andrejap Посмотреть сообщение
- int* pt;
юзай этот. он логичнее
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
23.02.2014, 04:11  [ТС] #3
Цитата Сообщение от some_name Посмотреть сообщение
юзай этот. он логичнее
Мерси. В том то и дело, что мне кажется логичнее запускать с разыменовкой, а объявлять так как я и делаю. Ведь это же тип. Но с фундаментальной точки зрения, почему не обязательно разыменовывать указатель на ф-ию?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.02.2014, 05:55 #4
Цитата Сообщение от andrejap Посмотреть сообщение
Но с фундаментальной точки зрения, почему не обязательно разыменовывать указатель на ф-ию?
Прата.
1
Миниатюры
Не обязательно разыменовывать указатель на функцию при вызове?  
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
23.02.2014, 16:00  [ТС] #5
alsav22, это я читал.

Добавлено через 2 часа 44 минуты
alsav22, еще смущает другой момент. Можете объяснить почему массив из трех указателей на функции необходимо объявлять так, например:

const int* (*ptrf[3])(My_type1*, My_type2*) = {function1, function2, function3}; ?

Почему не const int* ((*ptrf)(My_type1*, My_type2*))[3] = {function1, function2, function3}; ?

Вопрос, наверное, глуп и связан с приоритетами, но все-же хотелось бы прочитать ответ для полного понимания.
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.02.2014, 16:07 #6
Цитата Сообщение от andrejap Посмотреть сообщение
И как, вообще, удобней по-вашему писать указатели? Например:
- int* pt;
- int * pt;
- int *pt.
C++
1
int* pt;
писать так потому что звездочка относится к типу, но при этом помнить
C++
1
int* pt1, pt2; //pt2 не указатель
исходя из этого лучше: одна строка - одна переменная
C++
1
2
3
4
int* pt1;
int pt2;
int* pt3;
int* pt4;
Добавлено через 2 минуты
Цитата Сообщение от andrejap Посмотреть сообщение
const int* (*ptrf[3])(My_type1*, My_type2*) = {function1, function2, function3};
Почему не const int* ((*ptrf)(My_type1*, My_type2*))[3] = {function1, function2, function3}; ?
не рекомендовал бы вообще так писать, хочешь указатель на функцию - делай typedef
1
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.02.2014, 16:08 #7
использование варианта (*pf)(lines) может все обломать в каком-нибудь шаблонном коде,
который принимает функторы. pf(lines); - универсальный способ. в плюсах тип разыменовывания
указателей - ссылка. ссылок на функции нет. так что можно считать это особым случаем.
да и в других местах указатели на функции - особые случае. вот то же уродское объявление
указателеи и т.п.
тут лучше делать сперва тайпдеф и потом уже переменнные объявлять. так код понятнее:
C++
1
2
typedef const int* (*MyFunPtr)(MyType1*, MyType2*);
MyFunPtr myFuncs[3]; - вот тут понятно что имеем дело с массивом указателей на функции
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.02.2014, 16:11 #8
Цитата Сообщение от andrejap Посмотреть сообщение
alsav22, это я читал.
Если читали, то в чём тогда вопрос?
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
23.02.2014, 16:27 #9
Цитата Сообщение от andrejap Посмотреть сообщение
const int* ((*ptrf)(My_type1*, My_type2*))[3]
Потому что в этой записи [3] относится к возвращаемому значению.
Получается этой записью мы хотим вернуть массив указателей.
Но в С++ запрещено возвращать массивы как объекты (потому что в С++ они не объекты).
Зато можно возвращать ссылки на массивы:
C++
1
2
3
4
const int ( &func( const int (&arr)[5] ) )[5]
{
    return arr;
}
И это можно использовать, например, чтобы написать функцию, которая определяет размер масссива без sizeof:
C++
1
2
3
4
5
template <typename ArrT, size_t ArrN>
size_t sizeof_array(ArrT const (&arr)[ArrN])
{
    return ArrN;
}
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
23.02.2014, 16:38  [ТС] #10
Спасибо всем, начинает проясняться!
0
23.02.2014, 16:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 16:38
Привет! Вот еще темы с ответами:

Какие параметры нужно передать в функцию opengl при ее вызове, что бы код заработал? - C++
Добрый день. Имеется код: #include &lt;GL/glut.h&gt; #include &lt;iostream&gt; int opengl(int, char **argv); void draw(void); void...

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов - C++
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу избавиться. (Т.к. очень сильно плаваю в ООП)....

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru