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

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

Войти
Регистрация
Восстановить пароль
 
ChadloveMary
2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 99
#1

Объясните принцип работы части кода для вывода элементов контейнера - C++

20.03.2016, 17:18. Просмотров 159. Ответов 4

Вот, собственно говоря, сам код для вывода элементов контейнера:
C++
1
2
3
4
5
6
7
8
9
struct print {
    char sep;
    print(char s) : sep(s) { }
    inline void operator () (int x) const {
        std::cout << x << sep; 
    }
};
 
std::for_each(c.begin(), c.end, print('\t'));
Что происходит в 3 сточке? Объясните, пожалуйста, пошагово, что за чем следует?
Зачем в 4 строчке используется спецификатор inline? И что здесь тоже происходит? Перегружают (), но зачем?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2016, 17:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните принцип работы части кода для вывода элементов контейнера (C++):

Приложение на C++ для работы с API, подскажите/объясните принцип. - C++
Здравствуйте! Требуется написать программу(для себя любимого :)) на C/C++ для работы с API http://www.reg.ru/reseller/API2-tech ...

Удаление столбца с наибольшей по модулю суммой элементов из матрицы. Объясните принцип работы - C++
Есть кусок программы, который удаляет из матрицы столбец с наибольшей по модулю суммой элементов. int* Transplanirovanie(int *A, int m,...

Объясните принцип работы программы - C++
Добрый день ( вечер ). Мне дано было задание: Определить класс, объектами которого являются многоугольники указанного типа. ...

Объясните принцип работы программы - C++
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include &lt;conio.h&gt; ...

объясните принцип работы цикла : ? - C++
объясните принцип работы цикла : ?

Объясните, пожалуйста, принцип работы. - C++
Есть прога, считает сумму ряда, но ряд - знакочередующийся (-1,1,-1,...). При подсчете программа заканчивае работу на 1023 члене. Но чем...

4
cordfield
44 / 44 / 15
Регистрация: 04.05.2014
Сообщений: 184
20.03.2016, 18:48 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ключевое слово "inline" можно писать перед определением любой функции. Оно говорит о том, что функция короткая и её можно оптимизировать: вместо вызова функции компилятор может подставить в нужное место программы тело функции. Полезность ключевого слова "inline" зависит от компилятора и может быть нулевой.
В данном примере print является обычным классом. В 3-й строчке находится конструктор класса. Конструктор - это специальная функция, имя которой совпадает с именем класса. Конструктор вызывается при создании объекта класса.
В классе print содержатся данные, всего 1 символ sep. Этот символ инициализируется в конструкторе. Значение символа определяется при создании объекта, например:
C++
1
print a( '\t' );
Создаёт объект класса print, в котором значение поля sep будет равно символу "табуляция".
Оператор "скобки" не "перегружается", а добавляется в класс. Нельзя сказать, что оператор перегружен, если его раньше в классе не было.
Если в класс добавить оператор "скобки", данный оператор можно будет вызывать так:
C++
1
2
print a( '\t' );
a( 33 );
В примере оператор скобки принимает один аргумент - целое число.
Функция std::for_each в качестве третьего аргумента принимает любую сущность, к которой можно приписать скобки и в качестве аргумента передать элемент контейнера. Это может быть функция или класс с оператором "скобки" или что-то другое.
1
hoggy
6653 / 2841 / 486
Регистрация: 15.11.2014
Сообщений: 6,286
Завершенные тесты: 1
20.03.2016, 19:51 #3
Цитата Сообщение от ChadloveMary Посмотреть сообщение
Зачем в 4 строчке используется спецификатор inline?
ни зачем.

функции-члены, которые были определены в декларации класса
итак автоматически являются inline.

таким образом,
явно ещё раз это подчеркивать - избыточно.

Цитата Сообщение от cordfield Посмотреть сообщение
Оно говорит о том, что функция короткая и её можно оптимизировать
ложь.

inline - приказ программиста сделать функцию встраиваемой.
при этом не имеет значения ни её размеры,
ни возможности оптимизации.

Цитата Сообщение от cordfield Посмотреть сообщение
Полезность ключевого слова "inline" зависит от компилятора и может быть нулевой.
ложь.

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

например, inline функции можно определять прямо в хедерах.
вне зависимости от того, смог компилятор по факту оптимизировать или нет,
inline функции все равно будут обладать иммунитетом
против множественного определения.
0
cordfield
44 / 44 / 15
Регистрация: 04.05.2014
Сообщений: 184
20.03.2016, 20:43 #4
Hoggy, я специально прямо сейчас посмотрел в двух источниках. Поведение зависит от компилятора, ключевое слово inline носит для компилятора рекомендательный характер.
На msdn написано:
The insertion (called inline expansion or inlining) occurs only if the compiler's cost/benefit analysis show it to be profitable. Inline expansion alleviates the function-call overhead at the potential cost of larger code size.
https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx
На isocpp.org говорится:
There are several ways to designate that a function is inline, some of which involve the inline keyword, others do not. No matter how you designate a function as inline, it is a request that the compiler is allowed to ignore: the compiler might inline-expand some, all, or none of the places where you call a function designated as inline.
https://isocpp.org/wiki/faq/inline-functions
0
hoggy
6653 / 2841 / 486
Регистрация: 15.11.2014
Сообщений: 6,286
Завершенные тесты: 1
20.03.2016, 21:57 #5
Цитата Сообщение от cordfield Посмотреть сообщение
я специально прямо сейчас посмотрел в двух источниках.
смотреть нужно стандарт.

Цитата Сообщение от cordfield Посмотреть сообщение
Поведение зависит от компилятора
поведение корректно написанного кода не зависит ни от компилятора,
ни от его способностей к оптимизации,
ни от самих оптимизаций.

сам факт любых оптимизаций не может влиять на поведение программы.

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

если программист пометил функцию как inline,
то поведение должно соответствовать.

а теперь ещё раз вдумайтесь в эти строки:
Цитата Сообщение от hoggy Посмотреть сообщение
например, inline функции можно определять прямо в хедерах.
вне зависимости от того, смог компилятор по факту оптимизировать или нет,
inline функции все равно будут обладать иммунитетом
против множественного определения.
inline функция будет вести себя подобно inline функции вне зависимости от того,
оптимизировал ли её компилятор по факту, или нет.

именно в этом на сегодняшний день заключается смысл ключевого слова inline.

далеко ходить не нужно:
Ошибка LNK2005: многократное определение
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2016, 21:57
Привет! Вот еще темы с ответами:

Ханойские башни, объясните принцип работы! - C++
Можете мне &quot;расписать&quot; все что происходит в этом коде, плюс отдельные вопросы в &quot;комментариях&quot;, так что бы я сам смог это объяснить если...

Односвязные списки. Объясните принцип работы. - C++
обьясните плзз как раотает односвязный список

Объясните пожалуйста принцип работы указателей - C++
#include &lt;iostream&gt; using namespace std; int main() { int *p,num; p = &amp;num; *p=100;

не понимаю принцип работы кода - C++
Привет ! Помогите понять суть работы кода пожалуйста. for(i=1;i&lt;=10;sum+=i++); Как работает sum+=i++ НЕ ПОНИМАЮ ...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
20.03.2016, 21:57
Ответ Создать тему
Опции темы

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