pun4er, мне самому стало интересно. Давайте сначала разберёмся, почему в варианте "без параметров" никакие адреса не высвечиваются.
Тут нужно подумать...
Добавлено через 11 минут
pun4er, моих знаний не достаточно. Нужно звать на помощь экспертов.
Я не в состоянии понять, почему этот код вообще компилируется:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| //функция принимает один явный аргумент
ostream& endt(ostream &stream)
{
stream<<"1234";
return stream;
}
void main()
{
cout<<endt; //здесь кауту скармливается
//результат работы функции
//однако, при вызове функции
//вообще опущены аргументы
//не знал, что так можно.
//как функция догадается, какой именно объект
//ей скормили?
//Как она узнает, что такое steam ?
} |
|
*кастует Сыроежку*
Добавлено через 27 минут
Разобрался:
это в классе basic_ostream)
C++ |
1
2
3
| __ostream_type&
operator<<(__ostream_type& (*__pf)(__ostream_type&))
{ return __pf(*this); } |
|
значит запись:
равносильна:
Анализирую дальше...
Добавлено через 4 минуты
Вот эта запись:
C++ |
1
2
3
4
5
6
| void main()
{
int i=0;
for (i=0;i<7;i++) cout<<s<<endp;
getch();
} |
|
Эквивалентна вот этой:
C++ |
1
2
3
4
5
6
| void main()
{
int i=0;
for (i=0;i<7;i++) { cout<<s; endp(cout); }
getch();
} |
|
На самом деле вы кауту скармливаете не "манипулятор без параметров", а указатель на функцию.
Внутри самого каута происходит запуск этой функции, в качестве аргумента которой будит передан this потока.
Поэтому, в вашем втором случае каут запускает функцию-манипулятор передав ей самого себя в качестве аргумента. Но ему самому(кауту) никакие другие кауты уже не скармливаются. Поэтому, он никаких адресов и не выводит