В моих файлах .h / .cpp есть следующий код:
.h:
class Foo;
typedef Foo * pFoo;
class Foo {
public:
char c;
};
std::ostream& operator<<(std::ostream &out, const Foo &f);
std::ostream& operator<<(std::ostream &out, const pFoo &f);
.cpp:
std::ostream& operator<<(std::ostream &out, const Foo &f) { out << f.c; return out; }
std::ostream& operator<<(std::ostream &out, const pFoo &f) { out << f->c; return out; }
На основной когдаЯ запускаю следующий код:
Foo f;
f.c = 'a';
std::cout << "As foo object:" << f << std::endl;
std::cout << "As foo pointer:" << &f << std::endl;
Я получаю вывод:
As foo object:a
As foo pointer:a
Но, если, например, я заменю свой typedef на:
#define pFoo Foo*
Вместо этого я получаю вывод:
As foo object:a
As foo pointer:0x7fff5fbff980
Я знаю, что вы не можете перегрузить операторы для встроенных типов.Действительно ли typedef создает новый тип, или это просто псевдоним для существующего типа?Ответ, кажется, заключается в том, что он создает новый тип.Я в основном ищу более глубокое объяснение различий в поведении.(Я не пытаюсь сделать это в рабочем коде.)