首先,请看一些简单的代码,我的问题来源。
#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之后做cout。这两个函数都能做到这一点,但其中一个可以工作,而另一个则不行。
发布于 2020-07-03 14:17:05
这似乎是初学者中一个很常见的误解。通过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之后再做cout呢?我只是错过了cout真正做的事吗?
不知道我是否理解,但我会尽力.std::cout是std::ostream类型的对象。它有一个可以调用的operator<<,类似于调用其他对象的方法。以下两种语法是相同的,只是使用不同的语法:
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<<。
发布于 2020-07-03 14:21:52
这两个函数都有一个返回类型。只是其中一个有一个void返回类型。
std::ostream类对于接受void类型的<<没有重载。这是明智的--在这种情况下,会写什么到流中?
(cout是std::ostream的一个实例,它通常将自己写入标准输出,通常是用来启动程序的shell。)
发布于 2020-07-03 14:15:53
因为print_something()没有什么可返回的,而且cout想要将一些东西写入控制台(它所期望的返回值)。因此,它会产生错误。
另一方面,get_something()有一些东西要返回。因此,在执行行的其余部分后(除了return语句),它返回字符串,该字符串由cout打印
https://stackoverflow.com/questions/62717187
复制相似问题