【发布时间】:2012-02-13 19:22:24
【问题描述】:
我的 .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; }
在 main 中运行以下代码:
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 真的是在创建一个新类型,还是只是现有类型的别名?答案似乎是它正在创造一种新的类型。我基本上是在寻找行为差异之间的更深层次的解释。 (我不想在生产代码中这样做。)
【问题讨论】:
-
恕我直言,最好不要使用
#define或typedef创建“指针类型”。在需要声明指针的地方使用*会更清楚,并且可以避免这样的意外。此外,Linux Coding Standards 不允许使用 typedef 创建指针类型。来自第 5 章:“将typedef用于结构和指针是一个错误。当您在源代码中看到vps_t a;时,它是什么意思?相反,如果它显示struct virtual_container *a;你实际上可以分辨出a是什么。” -
我不反对。我更多地在代码上使用不同的变体来看看事情是如何工作的,但无法解释我看到的差异。对于出于不同原因查看此页面的人来说,您的 cmets 是正确的,或者当然是好的。
标签: c++ overloading typedef operator-keyword