相当于java.toString的C ++?
我想控制什么写入stream,即cout
,为自定义类的对象。 在C ++中可能吗? 在Java中,你可以重写toString()
方法来达到类似的目的。
在C ++中,您可以重载operator<<
for ostream
和您的自定义类:
class A { public: int i; }; std::ostream& operator<<(std::ostream &strm, const A &a) { return strm << "A(" << ai << ")"; }
这样你就可以在stream上输出你的类的实例了:
A x = ...; std::cout << x << std::endl;
如果您的operator<<
想要打印A
类内部实际需要访问其私有和受保护的成员,则还可以将其声明为朋友函数:
class A { private: friend std::ostream& operator<<(std::ostream&, const A&); int j; }; std::ostream& operator<<(std::ostream &strm, const A &a) { return strm << "A(" << aj << ")"; }
你也可以这样做,允许多态:
class Base { public: virtual std::ostream& dump(std::ostream& o) const { return o << "Base: " << b << "; "; } private: int b; }; class Derived : public Base { public: virtual std::ostream& dump(std::ostream& o) const { return o << "Derived: " << d << "; "; } private: int d; } std::ostream& operator<<(std::ostream& o, const Base& b) { return b.dump(o); }
在C ++ 11中,to_string最终被添加到标准中。
http://en.cppreference.com/w/cpp/string/basic_string/to_string
作为约翰所说的扩展,如果你想提取string表示并将其存储在std::string
请执行以下操作:
#include <sstream> // ... // Suppose a class A A a; std::stringstream sstream; sstream << a; std::string s = sstream.str(); // or you could use sstream >> s but that would skip out whitespace
std::stringstream
位于<sstream>
标头中。
这个问题已经回答了。 但是我想添加一个具体的例子。
class Point{ public: Point(int theX, int theY) :x(theX), y(theY) {} // Print the object friend ostream& operator <<(ostream& outputStream, const Point& p); private: int x; int y; }; ostream& operator <<(ostream& outputStream, const Point& p){ int posX = px; int posY = py; outputStream << "x="<<posX<<","<<"y="<<posY; return outputStream; }
这个例子需要理解操作符超载。