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

Aye*_*eYo 1 c++ cout function

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

#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;
}

Run Code Online (Sandbox Code Playgroud)

我注意到 get_something() 和 print_something() 之间唯一不同的是,一个是返回类型,一个不是。如您所见,我添加了一些注释,指出哪一个可以工作,哪些不工作。

但是,我真的不确定幕后发生的事情使一个成为可能,另一个不可能。我什至不确定我应该如何去寻找这种问题..所以我在这里问一个问题。

请赐教。。

编辑:我很困惑如何在 cout 之后进行 cout .. 两个功能都这样做,但其中一个有效,另一个无效。

for*_*818 5

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

你可以写:

std::string returned_value = get_something();
std::cout << returned_value;
Run Code Online (Sandbox Code Playgroud)

但是你不能写:

??? returned_value = print_something();   
std::cout << returned_value;
Run Code Online (Sandbox Code Playgroud)

因为print_something()不返回任何东西!void表示没有类型。您不能拥有类型为 的对象void

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

 print_something();       // prints something
 get_something();         // also print something and returned value is ignored
Run Code Online (Sandbox Code Playgroud)

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

PS:

我真正感到困惑的是,一次一次一次一次的一次一次一次一次一次一次一次一次,这怎么可能?我是否只是错过了 cout 的实际作用?

不确定如果我理解,但我会尝试...std::cout是类型的对象std::ostream。它有一个operator<<可以调用的,类似于调用其他对象的方法。以下两个是相同的,只是使用不同的语法:

std::cout.operator<<( "Hello World");
std::cout << "Hello World";
Run Code Online (Sandbox Code Playgroud)

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

std::cout << get_something(); 
Run Code Online (Sandbox Code Playgroud)

或多或少与(嗯,这是一个粗略的简化,但在这里应该没问题):

// inside get_something
std::cout << "output something"; 
// return value
std::string result{"output something"};
// now execution continues in caller
std::cout << result;
Run Code Online (Sandbox Code Playgroud)

调用coutaftercout与调用其他函数没有区别。假设你有一个print()打印一些东西的函数,那么你可以写

std::string print_and_return() {
        std::string x{"Hello World"};
        print(x);
        return x;
}
Run Code Online (Sandbox Code Playgroud)

来电者可以做

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

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


Bat*_*eba 5

你的两个函数都有一个返回类型。只是其中之一具有void返回类型。

std::ostream类不具有过载<<,需要一个void类型。这是明智的 - 在这种情况下会向流写入什么?

(cout是一个std::ostream通常将自身写入标准输出的实例,该输出通常是您用来启动程序的外壳。)