内容:

(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. (转) iOS深入学习(Block全面分析)

    本文翻译自苹果的文档,有删减,也有添加自己的理解部分. 如果有Block语法不懂的,可以参考fuckingblocksyntax,里面对于Block 为了方便对比,下面的代码我假设是写在ViewCon ...

  2. n!的近似值 (stirling approximation)与 大O记法(big -O- notation)

    參考wiki: 1.n!的近似值 (stirling approximation) (中文) http://zh.wikipedia.org/wiki/%E6%96%AF%E7%89%B9%E9%9D ...

  3. 依赖注入及AOP简述(十三)——AOP应用举例(完结) .

    2.     AOP应用举例 在一般的应用程序开发中,有一些典型的AOP应用,使得开发者可以专注于业务逻辑本身,而不是与之完全无关的一些“方面”. l        首先就是关于前面介绍过的日志输出类 ...

  4. C++顺序性容器、关联性容器与容器适配器

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  5. ftp 解决不能上传问题

    有人建议整个关掉SELinux并且重启,于是我去/etc/selinux/config里面把SELinux给disable了.重启之后,发现可以在/home/sam/test这个文件夹上传了!

  6. SharePoint 2013 强制安装解决方案

    Add-SPSolution Install-SPSolution -Identity DemonstrationZone.wsp -GACDeployment -CompatibilityLevel ...

  7. Android快速开发不可或缺的11个工具类

     Android快速开发不可或缺的11个工具类  :http://www.devst ore.cn/code/info/363.html

  8. Android App开之标注切图

    身为一个android开发狗,真是艰辛啊,适配不好做,Rom特性不好搞,连切图有时候都得自己上啊,设计师MM都不敢去惹呢,新技能Get开始. 其实,都是小case了,我有度娘和谷哥! 因为,有了psd ...

  9. eclipse中输入的中文为繁体的问题

    今天在eclipse中编写注释的时候发现,输入的中文都为繁体,且只在eclipse编辑器中为繁体,切换到网页中则为正常. 最后发现,竟然是输入法的shift+ctrl+F快捷键和eclipse的冲突. ...

  10. java.util.vector中的vector的详细用法

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...