重载<<
运算符时的最佳做法是什么。特别是,我如何区分指针上的操作与对象。是否犹豫是否在输入<<
时输出相同的字符串?
例如,请考虑以下代码,其中Book
个对象已初始化
Book b1;
Book* b2;
// initialization stuff
// can both of these output the same representation of a book object?
cout << b1 << endl;
cout << b2 << endl;
答案 0 :(得分:2)
不要将operator<<
重载为指针 - T
。相反,重载T
本身(或者更确切地说,const T&
),并在调用operator<<
时取消引用指针。
cout << *b2 << endl;
指针到T
的重载只会造成混淆和潜在的名称冲突,如果你为const T&
重载
答案 1 :(得分:2)
如何区分指针上的操作与对象。
通过operator<<
函数的签名:
std::ostream& operator<<(std::ostream&, const Book&); // operates on object
std::ostream& operator<<(std::ostream&, const Book*); // operates on pointer
他们两个都输出相同的字符串是否犹豫不决?
允许,但不是特别有用。很难看到第二种形式的实施。如果您想要实现第二种形式,请意识到它完全是多余的。例如,如果您有Book* pBook
:
std::cout << *pBook << "\n";
那将打印出pBook
指向的对象。