C++中运算符<<的重新定义
Redefinition of operator << in C++
我知道这个问题可能很愚蠢,但我是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;
}
正确的方法是什么?
>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;
}
首先,类定义应以分号结尾。
class Person {
// ...
};
其次,您说的是重载运算符而不是操作数。
运算符 <<是应用于两个操作数的二元运算符。如果要为标准输出流和类重载此运算符,则应将标准输出流指定为第一个参数。此外,通过常量引用传递类的对象要好得多。所以声明将看起来像
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 ) );
}
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 1<<31产生误差;'<<'表达式未定义”;
- 当运算符<存在时,为什么要定义 LT?
- 重载& lt; & lt;用于打印自定义异常的操作符
- & lt; & lt;使用继承和模板定义