0

我知道这个问题可能很愚蠢,但我是 C++ 新手,我在重新定义操作数时遇到了很多问题。我想要做的是重新定义操作数 << 以打印我的类“Person”信息,但它出现编译错误:

class Person {
private:
     string name;
     unsigned long personId;
     string address;
public:
    Person(string name2,unsigned long id,string adr) {
    name = name2;
    personId = id;
    address = adr;
}
void operator<<(Person person) {
     cout<<"Name: "<<person.name<<"  Person ID:  "<<person.personId<<"  Person address:  "<<person.address<<endl;
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
     Person person("Steven",1212121212,"USA");
     cout<<person; //compiling error here

     return 0;
}

这样做的正确方法是什么?

4

2 回答 2

6

operator <<是二元运算符,因此,在您的情况下,它的第一个参数应该是对std::ostream对象的引用。由于您的变量是私有的 - 您不能operator <<作为自由函数重载。类函数的第一个参数是指向此类对象的指针,因此您应该friend在函数上使用说明符(它授予对类的私有变量的访问权限)。

friend ostream& operator << (ostream& os, const Person& person)
{
   os << "Name: "<< person.name << "  Person ID:  "
      << person.personId << "  Person address:  " << person.address << endl;
   return os;
}
于 2013-11-15T12:48:21.700 回答
2

首先,类定义应以分号结尾。

class Person {
// ...
};

其次,您说的是重载运算符而不是操作数。

运算符 << 是应用于两个操作数的二元运算符。如果你想为标准输出流和你的类重载这个操作符,那么你应该指定标准输出流作为第一个参数。此外,通过 const 引用传递类的对象要好得多。所以声明看起来像

std::ostream & operator <<( std::ostream &os, const Person &person );

该运算符可以访问定义为私有的类的数据成员,它应该被声明为类的友元函数,或者可以访问类的公共方法,这些方法提供对私有数据成员的访问。

例如

class Person {
private:
     string name;
     unsigned long personId;
     string address;
     friend std::ostream & operator <<( std::ostream &os, const Person &person );

public:
    Person(string name2,unsigned long id,string adr) {
    name = name2;
    personId = id;
    address = adr;
};

或者

class Person {
private:
     string name;
     unsigned long personId;
     string address;
     ostream & out( std::ostream &os ) const;

public:
    Person(string name2,unsigned long id,string adr) {
    name = name2;
    personId = id;
    address = adr;
};

 std::ostream & operator <<( std::ostream &os, const Person &person )
 {
     return ( person.out( os ) );
 } 
于 2013-11-15T13:05:19.843 回答