内容:

(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. 用python处理文本数据 学到的一些东西

    最近写了一个python脚本,用TagMe的api标注文本,并解析返回的json数据.在这个过程中遇到了很多问题,学到了一些新东西,总结一下. 1. csv文件处理 csv是一种格式化的文件,由行和列 ...

  2. [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)

    Power of Fibonacci Time Limit: 5 Seconds      Memory Limit: 65536 KB In mathematics, Fibonacci numbe ...

  3. LeetCode: Surrounded Regions [130]

    [题目] Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is cap ...

  4. 基于HTML5 Canvas的网页画板实现教程

    HTML5的功能非常强大,尤其是Canvas的应用更加广泛,Canvas画布上面不仅可以绘制任意的图形,而且可以实现多种多样的动画,甚至是一些交互式的应用,比如网页网版.这次我们要来看的就是一款基于H ...

  5. Android入门——UI(9)

    SwipRefreshLayout下拉刷新控件 <?xml version="1.0" encoding="utf-8"?> <android ...

  6. OC中协议的概念以及用法

    OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...

  7. 开源一个监控数据采集Agent:OpenFalcon-SuitAgent

    OpenFalcon-SuitAgent 项目地址:github 版本说明 本系统版本划分如下 alpha:内部测试版(不建议使用于生产环境) beta:公开测试版(不建议使用于生产环境) final ...

  8. hadoop笔记之MapReduce的应用案例(利用MapReduce进行排序)

    MapReduce的应用案例(利用MapReduce进行排序) MapReduce的应用案例(利用MapReduce进行排序) 思路: Reduce之后直接进行结果合并 具体样例: 程序名:Sort. ...

  9. substr(dirname(__FILE__))

    这是discuz中定义论坛安装根目录的一个常量.现在我们就来分析一下这个很简单但是非常实用的常量.     define('DISCUZ_ROOT', substr(dirname(__FILE__) ...

  10. GO语言搭建

    最近对GO语言产生了浓厚的兴趣.因为GO语言不仅仅可以开发桌面.web程序,最吸引我的是安卓大有往GO语言全方位靠拢的趋势,自家的系统还是用自家的语言开发比较靠谱. 用一句话来说:Go语言是谷歌200 ...