内容:

(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. 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。

    题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解法一:暴力求解.从1开始查找M,然后判断M*N=X这个数字是否只含有0,1. 解法二:由 ...

  2. Girl_iOS100天学iOS的第一天(规划)

    不好的开端. 只是还好,总算是開始. 今天一直在做项目中的某个模块,发现自己尽管工作了一段时间,但编码速度还是够慢的 >.< 探究其为什么慢的原因,还是由于自己对某些控件等基础的不熟悉,如 ...

  3. javascript高级知识分析——定义函数

    代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...

  4. Linux网络管理——Linux网络命令

    3. Linux网络命令 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  5. hadoop笔记之Hive的管理(远程登录方式)

    Hive的管理(三) Hive的管理(三) Hive的远程服务 远程服务启动方式 端口号10000 启动方式:hive --service hiveserver (注意:以JDBC或ODBC的程序登录 ...

  6. Facebook 调试工具Stetho配置入门

    I decided to spend a few hours on Stetho.Stetho is a sophisticated debug bridge for Android applicat ...

  7. firefox 自写底层扩展,源码简介

    还记得2010年的时候,那时候开始喜欢上了js,经常逛MDN 一开始写些简单的油猴脚本,慢慢的接触了扩展开发,发现用自己的js知识 加上firefox的插件API,可以完成好多功能. 看了很多插件的源 ...

  8. (C)学生成绩管理系统

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h&g ...

  9. Generator & Co

    Generator 搬运自 http://es6.ruanyifeng.com/#docs/generator 如果没有babel等环境也可以在线体验 可以在http://www.es6fiddle. ...

  10. linux修改文本模式下的分辨率(CentOS6.4)

    root登录 vi /boot/grub/menu.lst 看到如下界面: 红框全出位置为分辨率设置,设置参数如下: 保存 shutdown -r now