重载operator<<运算符时第二个参数最好不能写成指向对象的指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重载operator<<运算符时第二个参数最好不能写成指向对象的指针相关的知识,希望对你有一定的参考价值。

如题,否则会在调用"std::cout<<this"时”偷偷“调用这个友元函数。本来是想看这个对象的指针值,却看到”不想看到的事情”。

#include <iostream>
using std::cout;
using std::endl;
using std::ostream;

class Tree {
  int height;
public:
  Tree(int treeHeight) : height(treeHeight) {
    cout << __func__ << "(), this = " << this << endl;
  }
  ~Tree() { cout << "~Tree()\n"; }
#if 1 
  friend ostream&
  operator<<(ostream& os, const Tree* t) {
    return os << "Tree height is: "
              << t->height << endl;
  }
#else
  friend ostream&
  operator<<(ostream& os, const Tree& t) {
    return os << "Tree height is: "
              << t.height << endl;
  }
#endif
}; 

int main() {
  Tree* t = new Tree(40);
  delete t;
  t = nullptr;
  delete t;
}

[email protected]:~/project/test/cpp/new_del$ g++ test2.cpp 

test2.cpp: In function ‘int main()’:

test2.cpp:31:7: error: ‘nullptr’ was not declared in this scope

   t = nullptr;

       ^

[email protected]:~/project/test/cpp/new_del$ g++ test2.cpp  -std=c++11

[email protected]:~/project/test/cpp/new_del$ ./a.out 

Tree(), this = Tree height is: 40


~Tree()


本文出自 “用C++写诗” 博客,谢绝转载!

以上是关于重载operator<<运算符时第二个参数最好不能写成指向对象的指针的主要内容,如果未能解决你的问题,请参考以下文章

c++中重载输出操作符,为啥要返回引用

C++之重载运算与类型转换

C ++ STL列表运算符重载对(根据第一个值排序,使用第二个值访问)

输入和输出运算符

为什么operator<<;;运算符重载一定要为友元函数呢?

C++对bool operator < (const p &a)const的运算符重载详解