C++ 如何理解ostream&;操作员<&书信电报;(ostream&;os,const unsigned char*s)

C++ 如何理解ostream&;操作员<&书信电报;(ostream&;os,const unsigned char*s),c++,C++,对于函数声明,如 ostream& operator<< (ostream& os, const unsigned char* s); ostream&operator因为您可以像这样返回“os”,所以可以进行链接 std::cout << "string1" << "string2" << std::endl; std::cout返回简单对象需要编译器生成对象副本,但返回引用则不需要。运算符返回ostream&(即对ostre

对于函数声明,如

ostream& operator<< (ostream& os, const unsigned char* s);
ostream&operator因为您可以像这样返回“os”,所以可以进行链接

std::cout << "string1" << "string2" << std::endl;

std::cout返回简单对象需要编译器生成对象副本,但返回引用则不需要。

运算符返回
ostream&
(即对
ostream
对象的可修改引用),而不是复制或无效,原因是它允许链接,例如,
std::cout
作为
ostream
对象的常见示例:

unsigned int i = 2;
std::cout << "This is a test to print " << "some text and maybe some numbers: " << i << std::endl;
无符号整数i=2;

std::cout第一个原因:
std::ostream
s通常不可复制(在C++11中,复制构造函数实际上是
delete
d)。您无论如何都不想返回副本,因为链接不起作用:

    std::stringstream s;
    s << "String1" << "String2";
    std::stringstream s;
    s << "String1" << "String2";
    assert(s.str() == "String1String2");
在这种情况下,
s
将只保留
“String1”
,因为当您通过
std::ostream
的副本返回
std::stringstream
时,返回的对象不再是
std::stringstream
对象并调用
操作符
    std::stringstream s;
    s << "String1" << "String2" << std::endl;
    assert(s == "String1String2");