question on cout and operator<<

S

subramanian100in

Consider the code:

#include <iostream>

using namespace std;

int main( )
{
cout << "test string ";
cout.operator<<(10).operator<<(endl);

return 0;
}

This prints
test string 10
followed by a newline as expected.

However, in main( ), if I have

cout.operator<<("test string
").operator<<(endl).operator<<(10).operator<<(endl);

it prints
0x804897c
10
followed by a newline. It does not print test string but instead
prints its address.

I do not understand.
Does it mean that operator<<(const char *) is not a member function of
ostream ? If so why ?

Kindly explain.

Thanks
V.Subramanian
 
G

Guest

Consider the code:

#include <iostream>

using namespace std;

int main( )
{
cout << "test string ";
cout.operator<<(10).operator<<(endl);

return 0;
}

This prints
test string 10
followed by a newline as expected.

However, in main( ), if I have

cout.operator<<("test string
").operator<<(endl).operator<<(10).operator<<(endl);

it prints
0x804897c
10
followed by a newline. It does not print test string but instead
prints its address.

I do not understand.
Does it mean that operator<<(const char *) is not a member function of
ostream ? If so why ?

You are correct, but as to why it is not a member I do not know. Last
time I saw this discussed none seemed to be able to come up with a good
reason, you could try asking in comp.std.c++ though.
 
S

subramanian100in

You are correct, but as to why it is not a member I do not know. Last
time I saw this discussed none seemed to be able to come up with a good
reason, you could try asking in comp.std.c++ though.

I just now found a member function
operator<<(const void * val)

Could the reason be the following :
If we wanted to print some address, we have to call
cout.operator<<(ptr) EXPLICITLY for any pointer ptr. So, by calling
cout.operator<<("test string"), the compiler assumes that we want to
print the address and so it prints 0x804897c
When we give cout << "test string", the overloaded non-member function
is called to print the string literal itself.

Is this reasoning correct ? Excuse me if I am wrong.

Kindly explain.

Thanks
V.Subramanian
 
G

Guest

I just now found a member function
operator<<(const void * val)

Could the reason be the following :
If we wanted to print some address, we have to call
cout.operator<<(ptr) EXPLICITLY for any pointer ptr. So, by calling
cout.operator<<("test string"), the compiler assumes that we want to
print the address and so it prints 0x804897c
When we give cout << "test string", the overloaded non-member function
is called to print the string literal itself.

Is this reasoning correct ? Excuse me if I am wrong.

Not quite, the only overload of the << operator which takes a pointer is
the one for the char* (or perhaps is was const char*), if you want to
print any other pointer you can use the operator as normal:

#include <iostream>

int main()
{
int* i = new int(1);
std::cout << i;
}

I would assume that the reason for overloading for char* is to allow the
common usage of printing a string literal:

std::cout << "Hello World";

which would not work otherwise.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top