利用递增(前置递增和后置递增)运算符的重载来打印输出自定义数据类型的对象 c++ 简单易懂

骑猪看日落 2022-10-13 05:23 183阅读 0赞

问题1::为什么要重载左移运算符?
因为本程序中写的是自定义数据类型的输出,编译器根本就不知道类中有哪些属性,所以必须通过重载左移运算符来实现自定义数据类型的对象的打印输出,再对它进行++的操作。
问题2::为什么前置递增在进行操作的时候返回的是引用,而后置递增运算在进行操作的时候返回的是一个值?
解释:前置递增返回引用是因为他们要操控的必须是同一块内存空间
才可以在原先的值保留的基础上再进行++的操作;
后置递增操作之所以不返回引用是因为:如果返回引用,返回的是局部对象的引用,局部对象的引用再当前语句被释放掉之后就没有了,释放空间后再对其进行操作时违法的(操作为再返回它的引用),所以返回值

  1. #include<iostream>//c++中标准的输入和输出流
  2. using namespace std;//该语句的意思是使用标准的名空间
  3. class myintger
  4. { public:
  5. //前置递增
  6. myintger&operator++()//注意一定要按照引用的方式来返回
  7. //否则操控的就不是同一块内存空间了,数据就会出错
  8. { //前置递增运算符应该先进行++的操作,再将自身进行返回
  9. this->m_a++;
  10. return *this;//返回对象用this指针
  11. }
  12. //注意前置和后置递增的区分
  13. //为了区分前置运算符和后置运算符的++
  14. //后置递增运算符的形参列表中有一个int
  15. //后置递增:
  16. myintger& operator++(int)
  17. {
  18. myintger temp=*this;//将当前的值做一个保存
  19. //以便之后可以返回,再进行一个递增的操作
  20. this->m_a++;
  21. return temp;
  22. }
  23. int m_a ;//该类的成员只能有一个因为递增运算符是单目运算符
  24. };
  25. ostream& operator<<(ostream& cout, myintger p)
  26. {
  27. cout << "p.m_a=" << p.m_a << endl;
  28. return cout;
  29. }
  30. void test01()
  31. {
  32. myintger p;
  33. p.m_a = 10;
  34. cout << p++ << endl;//要这样写首先要重载左移运算符
  35. cout << p++ << endl;
  36. cout << ++(++p) << endl;
  37. cout << (++(++p))++ << endl;
  38. }
  39. int main(void)
  40. {
  41. test01();
  42. system("pause");
  43. /* system("PAUSE");和system("pause");作用和效果一样,因为dos命令是不区分大小写的。 system("PAUSE") 是暂停的意思,等待用户信号;不然控制台程序会一闪即过,你来不及看到执行结果。*/
  44. return 0;//程序运行成功会返回一个0
  45. }

发表评论

表情:
评论列表 (有 0 条评论,183人围观)

还没有评论,来说两句吧...

相关阅读