Указатели на функции — различия между версиями
Материал из SEWiki
(Новая страница: «Указатели на функции в С++ Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается F f =…») |
|||
Строка 1: | Строка 1: | ||
− | Указатели на функции в С++ | + | == Указатели на функции в С == |
+ | |||
+ | |||
+ | == Указатели на функции в С++ == | ||
+ | |||
Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается | Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается | ||
+ | <source lang="cpp"> | ||
F f = qsort; // будет вызываться, что подойдет лучше всего | F f = qsort; // будет вызываться, что подойдет лучше всего | ||
+ | </source> | ||
Вопрос: | Вопрос: | ||
+ | |||
Как происходит работа с шаблонными функциями? | Как происходит работа с шаблонными функциями? | ||
+ | |||
Ответ: | Ответ: | ||
− | |||
+ | Рассмотрим пример 1: | ||
+ | <source lang="cpp"> | ||
+ | template <class It, class F> void A(It p, It q, F f); | ||
+ | A(v.begin(), v.end(), (int(*)(int))sqrt); // необходимо приведение типов | ||
+ | </source> | ||
+ | |||
+ | пример 2: | ||
+ | <source lang="cpp"> | ||
+ | template <class T> T sqrt(T *); | ||
+ | </source> | ||
+ | Нам необходимо проинстанциировать функцию, для этого существует несколько способов: | ||
+ | *<source lang="cpp"> | ||
+ | sqrt(0); | ||
+ | </source> | ||
+ | *<source lang="cpp"> | ||
+ | template sqrt<int>; // явно для T = int | ||
+ | </source> | ||
+ | В результате, метод A мы можем вызывать: | ||
+ | <source lang="cpp"> | ||
+ | A(v.begin(), v.end(), sqrt<int>); | ||
+ | </source> | ||
Вопрос: | Вопрос: | ||
Строка 12: | Строка 40: | ||
Ответ: | Ответ: | ||
Рассмотрим пример: | Рассмотрим пример: | ||
+ | <source lang="cpp"> | ||
struct Person { | struct Person { | ||
int m_age; | int m_age; | ||
Строка 20: | Строка 49: | ||
} | } | ||
} | } | ||
+ | </source> | ||
+ | |||
Тогда | Тогда | ||
+ | <source lang="cpp"> | ||
int Person::(*p) = &Person::m_age; | int Person::(*p) = &Person::m_age; | ||
string (Person::*f)() const = &Person::name; | string (Person::*f)() const = &Person::name; | ||
+ | </source> | ||
Далее имеем | Далее имеем | ||
+ | <source lang="cpp"> | ||
Person pers; | Person pers; | ||
(pers.*p) = 10; | (pers.*p) = 10; | ||
(pers.*f)(); | (pers.*f)(); | ||
+ | </source> | ||
Вопрос: | Вопрос: | ||
+ | |||
Мы имеем указатель на мембер класса. Можем ли мы его передавать как параметр функции? | Мы имеем указатель на мембер класса. Можем ли мы его передавать как параметр функции? | ||
+ | |||
Ответ: | Ответ: | ||
+ | |||
Да, можем. К примеру, | Да, можем. К примеру, | ||
+ | <source lang="cpp"> | ||
struct by_field { | struct by_field { | ||
by_field(int Person::*field) | by_field(int Person::*field) | ||
} | } | ||
+ | </source> | ||
Замечание: | Замечание: | ||
Указатели на мемберы не приводяться ник чему. Они могут проверяться на равенство 0. | Указатели на мемберы не приводяться ник чему. Они могут проверяться на равенство 0. |
Версия 00:25, 14 мая 2011
Указатели на функции в С
Указатели на функции в С++
Одно из отличие С и С++ - в С++ есть перегрузка. Тогда получается
F f = qsort; // будет вызываться, что подойдет лучше всего
Вопрос:
Как происходит работа с шаблонными функциями?
Ответ:
Рассмотрим пример 1:
template <class It, class F> void A(It p, It q, F f);
A(v.begin(), v.end(), (int(*)(int))sqrt); // необходимо приведение типов
пример 2:
template <class T> T sqrt(T *);
Нам необходимо проинстанциировать функцию, для этого существует несколько способов:
sqrt(0);
template sqrt<int>; // явно для T = int
В результате, метод A мы можем вызывать:
A(v.begin(), v.end(), sqrt<int>);
Вопрос: Как получить указатели на члены класса? Ответ: Рассмотрим пример:
struct Person {
int m_age;
int m_salary;
string m_name;
string name() {
return m_name;
}
}
Тогда
int Person::(*p) = &Person::m_age;
string (Person::*f)() const = &Person::name;
Далее имеем
Person pers;
(pers.*p) = 10;
(pers.*f)();
Вопрос:
Мы имеем указатель на мембер класса. Можем ли мы его передавать как параметр функции?
Ответ:
Да, можем. К примеру,
struct by_field {
by_field(int Person::*field)
}
Замечание: Указатели на мемберы не приводяться ник чему. Они могут проверяться на равенство 0.