我知道这个问题可能很愚蠢,但我是C ++的新手,我对操作数的重新定义有很多问题。 我要做的是重新定义操作数<<打印我的类“人员”信息,但它似乎编译错误:
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;
}
这样做的正确方法是什么?
答案 0 :(得分: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;
}
答案 1 :(得分:2)
首先,类定义应以分号结束。
class Person {
// ...
};
其次,你说的是重载操作符而不是操作数。
运营商&lt;&lt;是一个应用于两个操作数的二元运算符。如果要为标准输出流和类重载此运算符,则应指定第一个参数标准输出流。通过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 ) );
}