为什么这个使用 ostream 的字符串会导致 stackoverflow?
Why this usage string with ostream cause stackoverflow?
我只是想知道为什么这段代码不正确?它不断调用 Foo 构造函数并在一段时间后导致堆栈溢出。
#include <iostream>
using namespace std;
class Foo
{
std::string str;
public:
Foo(const string& s) : str(s)
{
cout << "Foo constructor" << endl;
}
friend ostream& operator<<(ostream& os,const Foo& foo);
};
ostream& operator<<(ostream& os,const Foo& foo)
{
os << foo.str;
return os;
}
int main()
{
Foo foo{"Hello"};
cout << foo;
cin.get();
}
我知道,我知道可以写
cout << foo.str << endl;
或os << foo.str.c_str();
但是我想知道为什么会出现这个错误..
该程序使用 std::string
及其输出运算符,但 不 包括 header <string>
:当使用 <string>
时您需要包括 header。 std::string
似乎是通过包含 <iostream>
来定义的事实是不够的。它也是不可移植的:不同的实现可能选择只声明而不定义 std::string
(但是需要声明,因为一些 IOStream 成员使用类型 std::string
)。
如果未找到 std::string
的输出运算符,则表达式
out << foo.str
被解释为
out << Foo(foo.str)
因为 是 Foo
的输出运算符。当然,这确实会导致无限递归。
我只是想知道为什么这段代码不正确?它不断调用 Foo 构造函数并在一段时间后导致堆栈溢出。
#include <iostream>
using namespace std;
class Foo
{
std::string str;
public:
Foo(const string& s) : str(s)
{
cout << "Foo constructor" << endl;
}
friend ostream& operator<<(ostream& os,const Foo& foo);
};
ostream& operator<<(ostream& os,const Foo& foo)
{
os << foo.str;
return os;
}
int main()
{
Foo foo{"Hello"};
cout << foo;
cin.get();
}
我知道,我知道可以写
cout << foo.str << endl;
或os << foo.str.c_str();
但是我想知道为什么会出现这个错误..
该程序使用 std::string
及其输出运算符,但 不 包括 header <string>
:当使用 <string>
时您需要包括 header。 std::string
似乎是通过包含 <iostream>
来定义的事实是不够的。它也是不可移植的:不同的实现可能选择只声明而不定义 std::string
(但是需要声明,因为一些 IOStream 成员使用类型 std::string
)。
如果未找到 std::string
的输出运算符,则表达式
out << foo.str
被解释为
out << Foo(foo.str)
因为 是 Foo
的输出运算符。当然,这确实会导致无限递归。