重载 ostream << 运算符返回地址
Overloading ostream << operator returning address
我正在制作一个简单的 Person class,它派生自 Object。
每个人都有一个名字 (char*)。
我希望能够打印使用 cout 的人的姓名。
我没有达到预期的结果。
这是我的代码:
Person.h
#include <iostream>
#include <cstring>
#ifndef _PERSON_H_
#define _PERSON_H_
using namespace std;
class Object {};
class Person : public Object {
private:
char* m_name;
public:
Person(char* input);
~Person();
char* getName() const;
//Set to friend because otherwise I was getting a compilation error.
friend ostream& operator<<(ostream& os, const Person& p);
};
#endif // _PERSON_H_
Person.cc
#include "Person.h"
#include <iostream>
#include <cstring>
Person::Person(char* input) {
m_name = new char[strlen(input)];
strncpy(m_name, input, strlen(input));
}
char* Person::getName() const{
return m_name;
}
/*Person& Person::operator=(const Person &rhs) {
delete [] m_name;
m_name = new char[strlen(rhs.getName())];
strncpy(m_name, rhs.getName(), strlen(rhs.getName()));
return *this;
}*/
ostream& operator<<(ostream& os, const Person& p) {
os << p.getName();
return os;
}
Person::~Person() {}
int main() {
char* tmp = "dave";
Person * p = new Person(tmp);
cout<<p;
}
上面代码的输出:
0x7fbba3c04b60
如果我把main的最后一行改成:
cout<<*p
我得到了想要的结果,即 dave。
我的参考资料:
Microsoft Developer Network
如何让 cout<<p
打印 dave
?
std::ostream& operator<<
有一个以十六进制格式打印地址的指针重载(除非它们是指向字符类型的指针,在这种情况下它假定一个空终止字符串。)当你说
cout<<p;
因为p
是一个指针。您可以使用其他指针进行测试:
int i = 0;
int* pi = &i;
double d = 3.14;
double* pd = &d;
cout << pi << ", " << pd << '\n';
您正在实现您想要的结果。只需使用
cout << p
调用显示指针 p
指向的地址的重载 std::ostream& operator<<(std::ostream&, void*)
。
cout << *p
取消引用指针并调用您的重载。
您 可以 为 Person*
重载 operator <<
,但这样做会非常不合常理,并且会让其他所有 C++ 用户感到困惑。
在 C++ 中正确的做法是不要假装指向对象的指针就是对象。
您可以提供一个也接受 Person* p
的运算符。但典型的实现是在指针前面放置一个星号——编译器随后将简单地传递指针,因为调用使用的是引用。
如果您希望您的对象在这两种情况下都有效
cout << p ;
cout << *p;
你还必须为指针重载你的运算符,所以你可以将它添加到你的代码中并保留旧的:
friend ostream& operator<<(ostream& os, const Person* p);
ostream& operator<<(ostream& os, const Person* p) {
os << p->m_name << "\n";
return os;
}
所以你有两个重载的运算符函数
friend ostream& operator<<(ostream& os, const Person* p)
和
friend ostream& operator<<(ostream& os, const Person p)
我正在制作一个简单的 Person class,它派生自 Object。 每个人都有一个名字 (char*)。 我希望能够打印使用 cout 的人的姓名。 我没有达到预期的结果。 这是我的代码:
Person.h
#include <iostream>
#include <cstring>
#ifndef _PERSON_H_
#define _PERSON_H_
using namespace std;
class Object {};
class Person : public Object {
private:
char* m_name;
public:
Person(char* input);
~Person();
char* getName() const;
//Set to friend because otherwise I was getting a compilation error.
friend ostream& operator<<(ostream& os, const Person& p);
};
#endif // _PERSON_H_
Person.cc
#include "Person.h"
#include <iostream>
#include <cstring>
Person::Person(char* input) {
m_name = new char[strlen(input)];
strncpy(m_name, input, strlen(input));
}
char* Person::getName() const{
return m_name;
}
/*Person& Person::operator=(const Person &rhs) {
delete [] m_name;
m_name = new char[strlen(rhs.getName())];
strncpy(m_name, rhs.getName(), strlen(rhs.getName()));
return *this;
}*/
ostream& operator<<(ostream& os, const Person& p) {
os << p.getName();
return os;
}
Person::~Person() {}
int main() {
char* tmp = "dave";
Person * p = new Person(tmp);
cout<<p;
}
上面代码的输出:
0x7fbba3c04b60
如果我把main的最后一行改成:
cout<<*p
我得到了想要的结果,即 dave。
我的参考资料: Microsoft Developer Network
如何让 cout<<p
打印 dave
?
std::ostream& operator<<
有一个以十六进制格式打印地址的指针重载(除非它们是指向字符类型的指针,在这种情况下它假定一个空终止字符串。)当你说
cout<<p;
因为p
是一个指针。您可以使用其他指针进行测试:
int i = 0;
int* pi = &i;
double d = 3.14;
double* pd = &d;
cout << pi << ", " << pd << '\n';
您正在实现您想要的结果。只需使用
cout << p
调用显示指针 p
指向的地址的重载 std::ostream& operator<<(std::ostream&, void*)
。
cout << *p
取消引用指针并调用您的重载。
您 可以 为 Person*
重载 operator <<
,但这样做会非常不合常理,并且会让其他所有 C++ 用户感到困惑。
在 C++ 中正确的做法是不要假装指向对象的指针就是对象。
您可以提供一个也接受 Person* p
的运算符。但典型的实现是在指针前面放置一个星号——编译器随后将简单地传递指针,因为调用使用的是引用。
如果您希望您的对象在这两种情况下都有效
cout << p ;
cout << *p;
你还必须为指针重载你的运算符,所以你可以将它添加到你的代码中并保留旧的:
friend ostream& operator<<(ostream& os, const Person* p);
ostream& operator<<(ostream& os, const Person* p) {
os << p->m_name << "\n";
return os;
}
所以你有两个重载的运算符函数
friend ostream& operator<<(ostream& os, const Person* p)
和
friend ostream& operator<<(ostream& os, const Person p)