Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Указатель на функцию

18.01.2019, 20:03. Показов 2085. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
объясните пожалуйста . не доходит.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
int fo(int a, int b){
 
 
 
return 0;
}
int main(int argc, char **argv){
 
 
int (*link)(int a, int b)=fo;// имя функции что указатель? 
 
 
 
 
return 0;
 
 
}
то есть имя функции содержит ее адрес первого байта? почему тогда я не могу сделать так?

C++
1
2
int *p;
p=&fo; // будет ошибка
что позволяет использовать в c++ имя функции как указатель,если она им не является?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.01.2019, 20:03
Ответы с готовыми решениями:

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

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

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

28
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
19.01.2019, 15:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Это просто просьба участникам форума, которые вдруг захотят посмотреть эту ветку и обладают более глубокими познаниями в программировании
То есть, без этой просьбы они не исправят, если захотят?
Или если не хотели исправлять, то эта просьба повлияет и они исправят?
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
21.01.2019, 20:33  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Примерно так
подскажите еще пожалуйста, как сделать чтобы можно был вне метода выводить на экран?


C++
1
2
3
4
5
6
7
8
#include <iostream>
std::cout
 
class fo{
int a=3;
std::cout  << a;
 
};// что то вроде этого можно?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.01.2019, 20:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class fo
{
    int a=3;
    friend std::ostream &operator<<(std::ostream &, const fo &);
};
 
std::ostream &operator<< (std::ostream &stream, const fo &value)
{
    return stream << value.a;
}
 
int main()
{
    fo a0;
    std::cout << a0;
}
или
C++
1
2
3
4
5
6
7
8
9
10
class fo
{
public:
    int a=3;
};
 
std::ostream &operator<< (std::ostream &stream, const fo &value)
{
    return stream << value.a;
}
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
21.01.2019, 21:14  [ТС]
у меня от этого кода что-то голова кругом пошла. сложно.

можно проще?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
почему я могу сделать так?
#include <iosteam>
class f{
public: 
int const a=11;
f(){std::cout << a;}// это же конструктор .
 
а вот так
 
class f{
public: 
int const a=11;
std::cout << a; // будет ошибка. но ведь это тоже конструктор. просто он по умолчанию.
я хочу понять.  потому что без понимания нет смысла в изучении. это не просто вопросы ради беседы.
 
};
[CPP]
[/CPP]
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
22.01.2019, 00:42
Цитата Сообщение от pcmax Посмотреть сообщение
я хочу понять.
В любом изучении одно строится на другом. Более сложные концепции строятся на простых, те, в свою очередь, еще на более простых. Если вам сложен тот код, который выше показали, то это значит, что где-то вы недоучили более простые понятия.

У вас вообще план обучения есть какой-то? Вы по книге учите или еще как?

Учебник-книга чем хорош, так это тем, что план там уже есть. Также есть задания для закрепления. Если вы учите язык по статьям в интернете или по видео, где либо нет плана вообще, либо он неполный, то качество вашего обучения будет сильно страдать.
1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
22.01.2019, 00:52
Цитата Сообщение от pcmax Посмотреть сообщение
можно проще?
В смысле? Если вы хотите выводить содержимое класса на консоль (или ещё куда), у вас никак не получится это сделать вне метода этого класса (за исключение публичные данные и копии/константные ссылки данных, выдаваемые методами класса).
То, что показал TRam_, есть перегрузка оператора вывода в поток данных, что тоже метод класса.
Может из разбора станет понятно что к чему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass
{
private:
    int data;
public:
    MyClass(int n_data) : data(n_data) {}
    
    
    /*(1)*/friend /*(2)*/ostream& /*(3)*/operator<< /*(4)*/(ostream& out, MyClass& mc)
    {
        /*(5)*/out << mc.data;
        /*(6)*/return out;
    }
}
Итак, под номером один у нас ключевое слово friend, оно служит для создания так называемых friend-functions или дружественных функций. Этот, своего рода, костыль необходим, когда стороннему объекту другого класса (в нашем случае объекту класса потока вывода ostream) нужно получить доступ к приватным методам и данным нашего класса. Так как обычно, в классе методы скрыты, для защиты от любителей велосипедов, то чтобы запихнуть все нужные поля данных текущего класса в поток вывода (или ввода), ему (потоку) как раз и нужны эти скрытые данные, в следствии чего и появляется ключевое слово friend, предоставляющее такую возможность.
Так как перегрузка операторов, это тоже своего рода методы, то и возвращаемый тип у них есть. В принципе, при перегрузке записи и чтения из потока, можно и не возвращать этот поток обратно в программу, однако в таком случае, мы не сможем записать сразу нескольких элементов:
C++
1
cout << some_variable << ' ' << myClass_object << endl;
Поэтому, навряд ли кто-то ставит возвращаемый тип, при перегрузке данных операторов, в void.
Собственно, под цифрой 3 у нас идет сам оператор, который мы и перегружаем.
Под цифрой 4 - аргументы метода: ссылка на объект ostream, которым может является как поток вывода на консоль, так и поток вывода в файл; и ссылка на объект класса, в котором мы и перегружаем данный оператор.
Под цифрой пять идет запись данных в поток.
И, наконец, последим идет возврат заявленного объекта типа ostream&.
Надеюсь картина стала немного ясней, а если нет, то не переживайте, уверен, когда будете проходить классы по подробней, вам обязательно расскажут о всех тонкостях.
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
22.01.2019, 01:20
Цитата Сообщение от pcmax Посмотреть сообщение
почему я могу сделать так?
// будет ошибка. но ведь это тоже конструктор
Потому что конструктор - это метод класса (совпадающий по названию с классом и не возвращающий никаких значений). А а вот так - это никакой не конструктор, это задание полей по-умолчанию (что имеет более низкий приоритет по сравнению с заданием полей в конструкторе).
И да, конструкторов можно объявить сколько угодно, если указывать разные наборы аргументов, с которыми объект будет инициализироваться.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iosteam>
class f{
public: 
int const a=11;
f(){std::cout << a;}// выдаст 11
//f() : a(5) {std::cout << a;}// выдало бы 5, если объявить его вместо предыдущего
f(const int b) {std::cout << a << " " << b;} // если вызывать так:
                           // f f0(4); // то выдаст "11 4"
f(const int b, const char c) : a(b) {std::cout << a << " " << b << " " << c;} // тогда при вызове
                           // f f0(5, 'a'); // то выдаст "5 5 a"
};
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
22.01.2019, 12:02  [ТС]
Цитата Сообщение от Cortas Посмотреть сообщение
уверен, когда будете проходить классы по подробней, вам обязательно расскажут о всех тонкостях.
если бы)))))

Добавлено через 5 минут
Цитата Сообщение от Cortas Посмотреть сообщение
Если вы хотите выводить содержимое класса на консоль (или ещё куда), у вас никак не получится это сделать вне метода этого класса (за исключение публичные данные и копии/константные ссылки данных, выдаваемые методами класса).
почему?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
22.01.2019, 14:05
Цитата Сообщение от pcmax Посмотреть сообщение
почему?
Потому что попросту нет никакого доступа к данным. Вот пример:
C++
1
2
3
4
5
6
7
8
9
class someClass
{
private:
    int data;
public:
    someClass(){}
    someClass(int n) : data(n){}
    ...
};
Предположим, что в этом классе не предполагается перегрузка операторов вывода и арифметических операций, а так же, нет методов, по типу
C++
1
2
    //somewhere in someClass
    int getData() {return data;}
В таком случае, не имея никакого доступа к коду класса someClass, вы не сможете получить доступ к данным вне класса и, следовательно, не сможете вывести на экран переменную data.
В общем, не забивайте этим голову, если нужно вывести содержимое класса куда-нибудь, просто напишите метод display() и используйте, когда это необходимо. Конечно, запись по типу
C++
1
cout << i << " | " << someClass_object << ' ' << count << ' ' << foo(13) << endl;
будет удобнее, чем
C++
1
2
3
cout << i << " | ";
someClass_object.display();
cout << ' ' << count << ' ' << foo(13) << endl;
но если вам не до конца понятен метод перегрузки оператора вывода, то лучше пользоваться тем, что знаете, чем породить всякого рода ошибки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.01.2019, 14:05

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){}; cоздаю на нее указатель. int...

Указатель на указатель массива для передачи в функцию/цикл
При написании программы в универе, столкнулся с проблемой короткого описания массива в цикле и в функциях. Проблема такая есть у меня...

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

Передать в неуправляемую функцию указатель на указатель
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { FUNC((int **)ptr); ...

Указатель на функцию возвращающую указатель
Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в которой встречается указатель на функцию, принимающую параметр...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru