提问者:小点点

在cout语句中使用cout调用函数


首先,请看一下我的问题源自的一些简单代码。

#include <iostream>
#include <string>
using namespace std;

string get_something() 
{ 
    cout << "output something"; 
    return " and return something"; 
}
    
void print_something() 
{
    cout << "print something";
}

int main()
{
    cout << get_something();    // will work 
    cout << print_something();  // will NOT work

return 0;
}

我注意到get_something()和print_something()之间唯一的不同之处在于,一个是返回类型,另一个不是。 正如你所看到的,我已经添加了注释,指出哪一个可以工作,哪一个不能工作。

但是,我真的不太清楚,幕后到底发生了什么,让它一个可能,另一个不可能。 我甚至不知道我该如何去寻找这种问题。 所以我在这里问一个问题。

请告诉我。。

编辑:我很困惑,怎么可能做一个又一个cout。 两个函数都这样做,但其中一个可以工作,另一个不行。


共3个答案

匿名用户

两个函数都有返回类型。 只是其中一个返回类型为void

std::OStream类没有采用void类型的<<重载。 这是明智的--在这种情况下,将向流中写入什么?

(coutstd::ostream的实例,它通常将自身写入标准输出,标准输出通常是您用来启动程序的shell.)

匿名用户

这似乎是初学者非常普遍的误解。 通过cout打印内容与从函数返回值不同。 这是完全正交的东西。

你可以写:

std::string returned_value = get_something();
std::cout << returned_value;

但你不能写:

??? returned_value = print_something();   
std::cout << returned_value;

因为print_something()不返回任何内容! void表示缺少类型。 不能有void类型的对象。

另一方面,当你调用一个函数时,你可以使用返回的值(上面),也可以忽略它,所以这是正确的代码:

 print_something();       // prints something
 get_something();         // also print something and returned value is ignored

注意,函数get_something应该获得一个更好的名称,因为它不仅仅是“获取”一个值。 print_and_return_something()怎么样?

PS:

我真正困惑的是,怎么可能一次又一次地做一次? 我是不是错过了cout的工作?

不确定我是否明白,但我会试着。。。 std::coutstd::Ostream类型的对象。 它有一个您可以调用的运算符&<<,类似于调用其他对象的方法。 下面两个是相同的,只是使用了不同的语法:

std::cout.operator<<( "Hello World");
std::cout << "Hello World";

当您调用print_something()时,首先执行函数,然后将返回值返回给调用方,并与调用方一起继续执行。 这个:

std::cout << get_something(); 

或多或少是相同的(嗯,这是一个粗略的简化,但在这里应该可以):

// inside get_something
std::cout << "output something"; 
// return value
std::string result{"output something"};
// now execution continues in caller
std::cout << result;

cout之后调用cout与调用某个其他函数没有什么不同。 假设您有一个函数print(),它打印一些内容,那么您可以编写

std::string print_and_return() {
        std::string x{"Hello World"};
        print(x);
        return x;
}

呼叫者可以做

std::string x = print_and_return(); // <- this already calls print()
print(x);                           // now we call it again

这与您的基本相同,只是我使用了一些假设的print(),而不是std::cout::operator<<<

匿名用户

因为print_something()没有要返回的东西,而cout想要向控制台写入一些东西(它所期望的返回值)。 因此,它会给出误差。

另一方面,get_something()有一些要返回的内容。 因此,在执行其馀行(return语句除外)之后,它返回字符串,该字符串由cout打印