一、重载类型强制转换运算符

在C++中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后,“(类型名)对象”这个对对象进行类型强制转换的表达式就等价于“对象.operator类型名()”,即变成对运算符函数的调用。

下面的程序对double类型类型强制转换运算符进行了重载。

  1. #include <iostream>
  2. using namespace std;
  3. class Complex
  4. {
  5. double real,imag;
  6. public:
  7. Complex(double r=,double i=):real(r),imag(i) { };
  8. operator double () { return real; }
  9. //重载强制类型转换运算符 double
  10. };
  11. int main()
  12. {
  13. Complex c(1.2,3.4);
  14. cout << (double)c << endl; //输出 1.2
  15. double n = + c; //等价于 double n=2+c.operator double()
  16. cout << n; //输出 3.2
  17. }

二、重载自增、自减运算符

自增运算符++、自减运算符--有前置/后置之分,为了区分所重载的是前 置运算符还是后置运算符,C++规定:

前置运算符作为一元运算符重载

重载为成员函数:

T & operator++();

T & operator--();

重载为全局函数:

T1 & operator++(T2);

T1 & operator--(T2);

后置运算符作为二元运算符重载,多写一个没用的参数:

重载为成员函数:

T operator++(int);

T operator--(int);

重载为全局函数:

T1 operator++(T2,int );

T1 operator—( T2,int);

但是在没有后置运算符重载而有前置重载的情况下,在vs中,obj++ 也调用前置重载,而dev则令 obj ++ 编译出错

(1)

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.   CDemo d();
  6.   cout << (d++ ) << ","; //等价于 d.operator++(0);
  7.   cout << d << ",";
  8.   cout << (++d) << ","; //等价于 d.operator++();
  9.   cout << d << endl;
  10.   cout << (d-- ) << ","; //等价于 operator--(d,0);
  11.   cout << d << ",";
  12.   cout << (--d) << ","; //等价于 operator--(d);
  13.   cout << d << endl;
  14.   return ;
  15. }
  16. class CDemo {
  17. private :
  18.   int n;
  19. public:
  20.   CDemo(int i=):n(i) { }
  21.   CDemo & operator++(); //用于前置形式
  22.   CDemo operator++( int ); //用于后置形式
  23.   operator int ( ) { return n; }
  24.   friend CDemo & operator--(CDemo & );
  25.   friend CDemo operator--(CDemo & ,int);
  26. };
  27. CDemo & CDemo::operator++()
  28. { //前置 ++
  29.   ++n;
  30.   return * this;
  31. } // ++s即为: s.operator++();
  32. CDemo CDemo::operator++( int k )
  33. { //后置 ++
  34.   CDemo tmp(*this); //记录修改前的对象
  35.   n ++;
  36.   return tmp; //返回修改前的对象
  37. } // s++即为: s.operator++(0);
  38. CDemo & operator--(CDemo & d)
  39. {//前置--
  40.   d.n--;
  41.   return d;
  42. } //--s即为: operator--(s);
  43. CDemo operator--(CDemo & d,int)
  44. {//后置--
  45.   CDemo tmp(d);
  46.   d.n --;
  47. return tmp;
  48. } //s--即为: operator--(s, 0);

(2)

  1. operator int ( ) { return n; }

这里,int 作为一个类型强制转换运算符被重载, 此后

  1. Demo s;
  2. (int) s ; //等效于 s.int();

类型强制转换运算符被重载时不能写返回值类型,实际上其返回值类型就是该类型强制转换运算符代表的类型

三、运算符重载的注意事项

1. C++不允许定义新的运算符 ;

2. 重载后运算符的含义应该符合日常习惯

complex_a + complex_b

word_a > word_b

date_b = date_a + n

3. 运算符重载不改变运算符的优先级;

4. 以下运算符不能被重载:“.”、“.*”、“::”、“?:”、sizeof;

5. 重载运算符()、[]、->或者赋值运算符=时,运算符重载函数必须声明为类的成员函数。

Question:

如何区分自增运算符重载的前置形式和后置形式?

A) 重载时,前置形式的函数名是 ++ operator,后置形式的函数名是 operator ++

B) 后置形式比前置形式多一个 int 类型的参数

C) 无法区分,使用时不管前置形式还是后置形式,都调用相同的重载函数

D) 前置形式比后置形式多了一个int类型的参数

《新标准C++程序设计》4.7-4.9(C++学习笔记17)的更多相关文章

  1. 《新标准C++程序设计》4.5(C++学习笔记15)

    实例:长度可变的整型数组类 int main() { //要编写可变长整型数组类,使之能如下使用: CArray a; //开始里的数组是空的 ; i < ; ++i) a.push_back( ...

  2. 《新标准C++程序设计》4.6(C++学习笔记16)

    重载流插入运算符和流提取运算符 流插入运算符:“<<” 流提取运算符:“>>” cout 是在 iostream 中定义的,ostream 类的对象. “<<” 能 ...

  3. 《新标准C++程序设计》4.4(C++学习笔记14)

    运算符重载为友元函数 一般情况下,将运算符重载为类的成员函数,是较好的选择. 但有时,重载为成员函数不能满足使用要求,重载为普通函数,又不能访问类的私有成员,所以需要将运算符重载为友元. class ...

  4. 《新标准C++程序设计》4.1(C++学习笔记12)

    运算符重载的概念和原理 一.运算符重载的需求 C++预定义的“+.-. * ./.%. ^ .&.~.!.|. = .<< >>.!= ”等运算符,只能用于基本数据类型 ...

  5. 《新标准C++程序设计》3.8(C++学习笔记10)

    友元 友元分为友元函数和友元类两种. 一.友元函数 在定义一个类的时候,可以把一些函数(包括全局函数和其它类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对 ...

  6. 《新标准C++程序设计》3.5(C++学习笔记8)

    常量对象和常量成员函数 一.常量对象 如果希望某个对象的值初始化后就再也不被改变,则定义该对象时可以在前面加const关键字,使之成为常量对象. class CDemo { private: int ...

  7. 正确处理类的复合关系------新标准c++程序设计

    假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类.狗是有主人的,主人也有狗.假定狗只有一个主人,但一个主人可以有最多10条狗.该如何处理“主人”类和“狗”类的关系呢?下面是 ...

  8. 在成员函数中调用虚函数(关于多态的注意事项)------新标准c++程序设计

    类的成员函数之间可以互相调用.在成员函数(静态成员函数.构造函数和析构函数除外)中调用其他虚成员函数的语句是多态的.例如: #include<iostream> using namespa ...

  9. 多态实现的原理------新标准c++程序设计

    “多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定.例子: #include<iostream> using namespac ...

  10. 多态的作用-游戏编程展示------新标准c++程序设计

    游戏软件的开发最能体现面向对象设计方法的优势.游戏中的人物.道具.建筑物.场景等都是很直观的对象,游戏运行的过程就是这些对象相互作用的过程.每个对象都有自己的属性和方法,不同对象也可能有共同的属性和方 ...

随机推荐

  1. 使用git commit命令时会提示"Please tell me who you are"

    在命令行中输入 git config --global user.email "邮箱地址" git config --global user.name "用户名" ...

  2. 吴裕雄--天生自然 JAVA开发学习:java使用Eclipel连接数据库

    1:jar可到Mysql官网下载:地址Mysql 连接jar包.:https://dev.mysql.com/downloads/connector/j/如图,在下拉列表框中选择Platform In ...

  3. Nginx解决服务器宕机问题

    1.Nginx解决服务器宕机问题,Nginx配置服务器宕机策略,如果服务器宕机,会找下一台机器进行访问 配置nginx.cfg配置文件,在映射拦截地址中加入代理地址响应方案 location / { ...

  4. Windows驱动开发-IRP超时处理

    IRP被送到底层驱动程序以后,由于硬件设备的问题,IRP不能得到及时处理,甚至有可能永远不会被处理,这时候需要对IRP超时情况进行处理,一旦在规定时间内,IRP没有被处理,操作系统就会进入到IRP的处 ...

  5. 解题报告:luogu P5745 【深基附B例】数列求和

    题目链接:P5745 [深基附B例]数列求和 现在想说:\(O(N)\)的题要不怎么也想不出来,要不灵光乍现,就像这道题. 我们维护一个类似单调队列的加法单调队列: 若相加大于此数,就将队尾元素弹出, ...

  6. prototype入门----自定义创建元素

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. leetcode菜鸡斗智斗勇系列(5)--- 寻找拥有偶数数位的数字

    1.原题: https://leetcode.com/problems/find-numbers-with-even-number-of-digits/ Given an array nums of ...

  8. nrm 源管理器

    什么是nrm nrm 是一个 npm 源管理器,允许你快速地在 npm 源间切换. 安装nrm 在命令行执行命令,npm install -g nrm,全局安装nrm. 使用 执行命令nrm ls查看 ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:表示信息变化的操作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Rabbitmq概念用法

    MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列 ...