内容:

(1)输入输出运算符重载
(2)友元类和友元函数
(3)双目运算符重载
(4)单目运算符重载
(5)不能被重载的运算符
(6)只能定义为成员形式的运算符

1.输入输出运算符重载
如:
int num = 10;
cout << num << endl; //10
char c = 'A';
cout << c << endl; //'A'
double d = 3.14;
cout << d << endl; //3.14
Student s;
cout << s << endl;

解析为:
cout.operator<<(num);
cout.operator<<(c);
cout.operator<<(d);
cout.operator<<(s);

再次解析:
cout.operator<<(int);
cout.operator<<(char);
cout.operator<<(double);
cout.operator<<(Student);

/usr/include/c++/4.6/ostream文件
ostream是一个类类型,是cout的数据类型

再次解析:
operator<<(cout,s);
operator<<(ostream,Student);

注意:
cin是istream类型的对象

练习:
自定义一个分数类,属性有:分子和分母,提供一个有参的构造函数,要求支持输入输出运算符重载
如:
2/3 分母不可以为0

2.友元类和友元函数
使用friend关键字修饰的类和函数

(1)友元不是成员,只是为了声明它可以访问我的私有部分而已,被声明的友元可以访问类中的任何成员
(2)友元声明可以出现在类的公有、私有、保护任何一个部分,效果都是一样的,不受访控属性的限制,一般放在类的尾部

3.双目运算符重载
格式:
L/*左操作数*/ #/*运算符*/ R(右操作数)
=> L.operator#(R); 成员形式
=> operator#(L,R); 非成员形式

如:
s + s2;
=> s.operator+(s2);
=> operator+(s,s2);

建议:
尽量使用成员形式的重载函数

练习:
在分数类中,编写支持 + - += -=运算符重载
1/2 + 1/3 = 3/6 + 2/6 = 5/6

4.单目运算符重载
4.1 格式:
O/*操作数*/ #/*操作符*/
=>O.operator#(); 成员形式
=>operator#(O); 非成员形式

练习:
自定义复数类,要求支持输出运算符重载即可

4.2 自增减运算符的重载
(1)前缀自增减运算符
a.表达式的值是增减以后的值
b.运算函数返回的是操作数的引用
c.成员形式的运算符函数没有参数,友元形式的运算符函数只有一个参数 - 操作数
d.可以连用

(2)后缀自增减运算符
a.表达式的值是增减以前的值
b.运算函数返回的增减以前的副本
c.成员形式运算符函数有一个int类型的哑元参数;友元形式运算符函数有两个参数,第一个是操作数,第二个是int类型的哑元
d.不可以连用

练习:
自定义分数类,要求有参的构造函数,支持输出运算符重载,负号重载,以及前后缀++运算符重载

4.3 类型转换运算符函数
在源类型中定义如下形式的函数:
operator 目标类型(void)
{
构造一个目标类型的对象,返回
}

功能:
将源类型的对象转换为目标类型的对象

注意:
如果在源类型中提供类型转换运算符函数的同时,在目标类型中定义了类型转换的构造函数,则对于隐式类型转换则优先选择类型转换运算符函数,而对于显式类型转换,则优先选择类型转换的构造函数

建议:
建议不要提供两个,优先选择构造函数的方法(explicit)

5.不能被用户重载的运算符
:: - 作用域限定符
. - 成员访问操作符
.* - 成员指针解引用
?: - 三目运算符
sizeof - 计算类型的大小
typeid - 获取数据类型的名称

注意:
(1)操作符的操作数中没有类类型的操作数,不能重载
(2)不能通过重载运算符去发明新的操作符
如: * **

作业:
实现一个整型的数组类IntArray,通过构造函数来指定数组的容量,注意在析构函数释放资源,提供的成员函数有:
push() 在数组的尾部插入一个元素
pop() 在数组的尾部弹出一个元素
get() 根据下标获取一个元素的值
set() 根据下标设置一个元素的值
print() 打印数组中的所有元素

C++_基础_运算符重载的更多相关文章

  1. C++_基础_运算符重载2

    内容: (1)只能用成员形式重载的运算符 (2)new/delete操作符的重载 (3)封装和继承的初识 (4)继承的特性 (5)子类及其函数的特性 (6)多重继承和虚继承 1.只能用成员形式重载的运 ...

  2. 网易云课堂_C++开发入门到精通_章节4:运算符重载

    课时23运算符重载 运算符重载 重载赋值运算符 Person& Person::operator=(const Person& other) { //检查自赋值 if (this == ...

  3. C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)

    运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运 ...

  4. C++_基础_类和对象3

    内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...

  5. C++语言基础(17)-运算符重载

    运算符重载的格式为: 返回值类型 operator 运算符名称 (形参表列){ //TODO: } 一.在类里面实例运行符重载 #include <iostream> using name ...

  6. 面向对象程序设计-C++_课时30运算符重载——基本规则_课时31运算符重载——原型_课时32运算符重载——赋值_课时33运算符重载——类型转换

    区分初始化,赋值 #include <iostream> using namespace std; class Fi { public: Fi() {}//1构造函数 }; class F ...

  7. C++_基础_继承、多态

    内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...

  8. C++_基础_类和对象2

    内容: (1)构造函数 (2)初始化列表及其必要性 (3)支持自定义类型转换的构造函数 (4)this指针 (5)const对象和成员函数 (6)析构函数 1.构造函数1.1 格式: class 类名 ...

  9. java工程师_基础_阶段一_HTML笔记篇

    一.了解HTML语言 html:超文本标记语言. 二.HTML整体结构<html> <head> </head> <body> </body> ...

随机推荐

  1. 依据Path取Json指定节点的值

    下面方法为依据Path取json节点值得方法.废话不多说,先上代码: 測试方法例如以下:

  2. linux 搭建Tomcat

    这几天用虚拟机装了centos ,以前没有用过linux,先将搭建java web 环境记录如下: 一.卸载系统安装的jdk环境. 1.安装好的CentOS会自带OpenJdk,用命令 java -v ...

  3. js数组和对象互转方法

    <script> let arr = [2, 3, 4, 2, 3, 4]; // 数组转化为对象 function toObject(arr) { let obj = { } for(l ...

  4. 关于js中的类型内容总结(类型识别)

    JS 有7种数据类型: 6种原始类型:Boollean    String   Number    Null    Underfined   Symbol 引用类型:Object 类型识别主要有以下四 ...

  5. HTML5实现坦克大战(一)

      Tank 字段 x:坦克的中心点的横坐标 y:坦克的中心点的纵坐标 dir:坦克的前进的方向 spped:坦克的速度 color:坦克的颜色,用于区分种类不同的坦克 bullet:坦克的子弹 为a ...

  6. CentOS 6使用VNC配置远程桌面

    首先,配置vncservers(注意,rootW为1,普通用户按2,3以此类推) [root@hadoop1001 hadoop]# vi /etc/sysconfig/vncservers # VN ...

  7. C#:读取配置文件

    以下代码演示如何读取配置文件---------------------Factory.cs----------------------------using System;using System.C ...

  8. jboss清楚缓存

    在服务器上部署或更新时,常常会忘记删除JBOSS的缓存.忘记删除缓存的后果,经常就是改好了代码却还是原来的错误,然后查找半天,浪费时间.所以在重新部署JBOSS,在启动JBOSS前一定要删除JBOSS ...

  9. 创建SDE表空间

    创建空间数据存储类型为ST_Geometry的要素类有2种方法:1)使用SDE创建要素类从9.3 开始,默认创建的要素类都使用ST_Geometry存储空间数据,9.3 版本之前,可以通过配置dbtu ...

  10. Spring-----Assert断言工具类

    转载自:http://blog.csdn.net/hekewangzi/article/details/51956577