插入运算符不产生预期的输出?

Anj*_*ulu 10 c++

这是代码

#include<iostream>
using namespace std;
main()
{
    cout<<"Hellow World"<<endl;
    cout.operator<<("Hellow World");
    cout.operator<<(endl);
}
Run Code Online (Sandbox Code Playgroud)

我知道这cout<<"Hellow World"<<endl;被解释为 cout.operator<<("Hellow World"); 但是这段代码产生了以下结果

Hellow World

0x8048830

如果我使用operator<<(cout,"Hellow World");工作正常cout.operator<<("Hellow World");和 之间的区别 operator<<(cout,"Hellow World");

Sto*_*ica 15

std::basic_ostreamoperator<<两组,成员非成员超载.

不同之处在于,当您编写cout<<"Hellow World"<<endl;非成员重载时,const char*选择打印字符串文字.

当您调用成员版本时,最合适的只是void*过载.

  • @Anjaneyulu - 这是字符串文字的地址.并且转换为`char*`不会产生任何影响.当你直接调用成员重载时,你会从图片中取出`const char*`重载. (2认同)

cut*_*ptr 9

cout.operator<<("Hellow World");和 之间有什么区别operator<<(cout, "Hellow World");

当你写作时,cout.operator<<("Hellow World");你正在调用operator<<方法并传递一个const char *.因为这个方法没有重载以获取a const char *,但是重载以获取a const void *,这是你调用和获取的0x8048830那个(这是'H'你的字符串中的字符的地址).

当你写的时候,operator<<(cout, "Hellow World")你正在调用一个自由函数operator<<,它在左侧和const char *右侧都有一个输出流.碰巧存在这样的功能,它有以下声明(简化):

std::ostream& operator<<(std::ostream& os, const char *s);
Run Code Online (Sandbox Code Playgroud)

因此,您将打印出一系列字符,这些字符始于s,并在'\0'遇到的第一个字符结束时(所以你得到Hellow, world).

最后,当你写的std::cout << "Hello, world" << std::endl;,因为你是传递一个const char *operator<<,自由的功能,是一个完美的搭配,选择了该方法operator<<.