问题解答及修正代码
在你提供的代码中,重载了左移运算符 operator<<,并且将它定义为全局函数。你的问题是为什么在调用重载的左移运算符时,cout 必须在 Person 对象之前。
首先,让我们来看一下原始代码和问题所在的部分:class Person { friend ostream& operator<<(ostream& out, Person& p);public: Person(int a, int b) { this->m_A = a; this->m_B = b; }private: int m_A; int m_B;};ostream& operator<<(ostream& out, Person& p){ out << "a:" << p.m_A << " b:" << p.m_B; return out;}void test(){ Person p1(10, 20); cout << p1 << "hello world" << endl;}int main(){ test(); system("pause"); return 0;}
问题出在 operator<< 的定义处。在这里,你将 operator<< 定义为了一个全局函数,而不是 Person 类的成员函数。因此,在调用 operator<< 时,必须使用 cout 作为第一个参数。
在C++中,对于输出流操作符的重载,通常将其定义为类的成员函数。这样可以使得调用方式更加符合直觉,并且能够正确访问对象的私有成员。下面是修改后的代码:#include <iostream>using namespace std;class Person { friend ostream& operator<<(ostream& out, const Person& p);public: Person(int a, int b) { this->m_A = a; this->m_B = b; } // 将operator<<定义为成员函数 ostream& operator<<(ostream& out) const { out << "a:" << m_A << " b:" << m_B; return out; }private: int m_A; int m_B;};// 定义全局的operator<<重载函数ostream& operator<<(ostream& out, const Person& p){ return p.operator<<(out); // 调用Person类的operator<<成员函数}void test(){ Person p1(10, 20); cout << p1 << "hello world" << endl;}int main(){ test(); system("pause"); return 0;}
在修改后的代码中,operator<< 被定义为 Person 类的成员函数。这样,在调用 operator<< 时,可以使用对象本身作为左操作数,而无需将 cout 放在 Person 对象之前。
希望以上解答能够解决你的问题。如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!
|