重载ostream<<操作员返回地址

时间:2015-01-25 22:19:20

标签: c++ operator-overloading ostream

我正在创建一个派生自Object的简单 Person 类。 每个人都有一个名字(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

如果我将主要的最后一行更改为:

cout<<*p

我得到了所需的结果,即 dave

我的参考资料: Microsoft Developer Network

如何cout<<p打印dave

5 个答案:

答案 0 :(得分:2)

std::ostream& operator<<指针的重载以十六进制格式打印地址(除非它们是指向字符类型的指针,在这种情况下它假定以空字符结尾的字符串。)当你说

cout<<p;

因为p是一个指针。您可以使用其他指针对此进行测试:

int i = 0;
int* pi = &i;
double d = 3.14;
double* pd = &d;

cout << pi << ", " << pd << '\n';

答案 1 :(得分:1)

可能重载operator << Person*,但这样做对于C ++的每个其他用户来说都是极其单一的并且让人感到困惑。

在C ++中正确的做法是不要假装指向对象的指针是对象。

答案 2 :(得分:1)

如果您希望对象在两种情况下均可使用

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)

答案 3 :(得分:0)

您正在实现您想要的结果。只需使用

cout << p

调用重载std::ostream& operator<<(std::ostream&, void*),它显示指针p指向的地址。

cout << *p

取消引用指针并调用您的重载。

答案 4 :(得分:0)

您可以提供一个同时使用Person* p的运算符。但典型的实现只是在指针前放置一个星号 - 然后编译器将简单地传递指针,因为调用正在使用引用。