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

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

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

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

20.03.2016, 17:18. Просмотров 144. Ответов 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? И что здесь тоже происходит? Перегружают (), но зачем?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2016, 17:18     Объясните принцип работы части кода для вывода элементов контейнера
Посмотрите здесь:

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

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

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

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

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

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

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

Принцип работы кода: указатели, выделение памяти - C++
Объясните мне что делает этот код: p = new int ; И вот этот, пожалуйста: struct DList{ int m; DList *p};

Простое шифрование и дешифрование - объяснить принцип работы кода - C++
Программа шифрует и дешифрует знакомое всем &quot;Hello world&quot;. Люди с добрыми сердцами, подскажите как это происходит #include &quot;stdafx.h&quot; ...

Шаблонная функция вывода для любого stl контейнера - C++
Шаблонная функция вывода для любого STL-контейнера, где в качестве параметра должен быть тип контейнера. Собственно реализация довольна...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cordfield
38 / 38 / 13
Регистрация: 04.05.2014
Сообщений: 168
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 в качестве третьего аргумента принимает любую сущность, к которой можно приписать скобки и в качестве аргумента передать элемент контейнера. Это может быть функция или класс с оператором "скобки" или что-то другое.
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,723
Завершенные тесты: 1
20.03.2016, 19:51     Объясните принцип работы части кода для вывода элементов контейнера #3
Цитата Сообщение от ChadloveMary Посмотреть сообщение
Зачем в 4 строчке используется спецификатор inline?
ни зачем.

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

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

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

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

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

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

например, inline функции можно определять прямо в хедерах.
вне зависимости от того, смог компилятор по факту оптимизировать или нет,
inline функции все равно будут обладать иммунитетом
против множественного определения.
cordfield
38 / 38 / 13
Регистрация: 04.05.2014
Сообщений: 168
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
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,723
Завершенные тесты: 1
20.03.2016, 21:57     Объясните принцип работы части кода для вывода элементов контейнера #5
Цитата Сообщение от cordfield Посмотреть сообщение
я специально прямо сейчас посмотрел в двух источниках.
смотреть нужно стандарт.

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

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

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

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

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

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

далеко ходить не нужно:
Ошибка LNK2005: многократное определение
Yandex
Объявления
20.03.2016, 21:57     Объясните принцип работы части кода для вывода элементов контейнера
Ответ Создать тему
Опции темы

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