操作符重载、继承(day08)
二十 操作符重载
函数操作符"()"
功能:让对象当做函数来使用
注:对参数的个数、返回类型没有限制
eg:
class A{...};
A a;
//a.operator()(100,200)
a(,); 下标操作符"[]"
功能:让对象可以当做数组一样去使用
注:非常对象返回左值,常对象返回右值
eg:
string s("hello");
//s.operator[](0)
s[] = 'H';//ok
cout << s << endl;//Hello
-------------
const string s("hello");
s[] = 'H';//error 类型转换操作符
功能:实现自定义类型的转换
class 源类型{
operator 目标类型(void)const{...}
}; 操作符重载的限制
)不是所有的操作符都能重载,下面几个不能重载
--》作用域限定操作符 "::"
--》直接成员访问操作符 "."
--》直接成员指针解引用操作符 ".*"
--》条件操作符 "?:"
--》字节长度操作符 "sizeof"//获取类型大小
--》类型信息操作符 "typeid"//获取类型信息(后面讲)
)如果一个操作符的所有操作数都是基本类型,则无法重载。
int operator+(int a,int b){//error
return a - b;
}
)操作符重载不会改变编译器预定义优先级
)操作符重载无法改变操作数的个数(函数操作符例外)
)无法通过操作符重载机制发明新的的操作符
operator@()//error
)只能使用成员形式不能使用全局函数形式的操作符
=、()、[]、-> ===================
二十一 继承(Inheritance)
继承的概念
通过一种机制表达类与类之间共性和特性的方式,利用已有的类定义新的类,这种机制就是继承。 eg:描述人类、学生类、教师类
人类:姓名、年龄、吃饭、睡觉
学生类:姓名、年龄、吃饭、睡觉、学号、学习
教师类:姓名、年龄、吃饭、睡觉、工资、讲课
-------------
人类:姓名、年龄、吃饭、睡觉
学生类继承人类:学号、学习
教师类继承人类:工资、讲课 人类(父类/基类)
/ \
学生类 教师类(子类/派生类) 继承的语法
)定义
class 子类名
:继承方式1 基类1,继承方式2 基类2,...{};
)继承方式
public:公有继承
protected:保护继承
private:私有继承 eg:
class A{...};
//A类派生B类,B类继承A类
//A类称为基类(父类),B称为子类
class B:public A{
//B类中会存在一份A类中的成员
}; 公有继承特性(Public)
3.1 子类对象可以继承基类的属性和行为,通过子类访问基类中的成员,如果是基类对象在访问它们一样。
注:子类对象中包含基类的部分称为"基类子对象" 3.2 向上和向下造型
)向上造型//重点掌握
将子类类型的指针或引用转换为基类类型的指针或引用。这种操作范围缩小的类型转换,在编译器看来是安全的,所以可以隐式转换。
eg:
class Base{};
class Derived:public Base{};
void func(Base& b){}
int main(void){
Derived d;
Base* pb = &d;//向上造型
Base& rb = d;//向上造型
func(d);//向上造型
}
)向下造型//了解
将基类类型指针或引用转换为子类类型的指针或引用。这种操作范围放大的类型转换,在编译器看来是危险的,因此必须显式转换。 3.3 子类继承的基类成员
)在子类中,可以直接访问基类中公有成员和保护成员,就如同它们是子类自己的成员一样。
)在子类中,所继承过来的私有成员虽然存在(占据内存),但是不可见,所以无法直接访问,但是可以提供保护或公有的接口函数来间接访问。
)基类的构造函数和析构函数,子类无法继承,但是可以在子类自己的构造函数中通过初始化表,显式的指明基类部分(基类子对象)的初始化方式。
eg:
class Base{
public:
Base(int data):m_data(data){}
int m_data;
};
class Derived:public Base{
public:
Derived(int data1,int data2)
:Base(data1),m_data2(data2){}
int m_data2;
}; 3.4 子类隐藏基类中的成员
)子类和基类中定义同名的成员函数,因为作用域不同,不会构成重载关系,而是一种隐藏关系。如果需要在子类中访问所隐藏的基类成员,可以使用作用域限定操作符来显式指明。
)通过using声明可以将基类的成员函数引入子类的作用域的,形成重载。//不推荐 继承方式和访问控制属性
)三种访问控制限定符:影响访问该类成员的位置
访问控制 访问控制 内部 子类 外部 友元
限定符 属性 访问 访问 访问 访问
public 公有成员 ok ok ok ok
protected 保护成员 ok ok no ok
private 私有成员 ok no no ok
---------------------------------------------
)三种继承方式:影响通过子类访问基类中的成员的可访问性。
---------------------------------------------
基类中的 在公有子 在保护子 在私有子
类中变成 类中变成 类中变成
公有成员 公有成员 保护成员 私有成员
保护成员 保护成员 保护成员 私有成员
私有成员 私有成员 私有成员 私有成员
----------------------------------------------
注:私有子类和保护子类的指针或引用,不能转换为其基类类型的指针或引用(不能向上造型). 练习:复习公有继承的语法特性
操作符重载、继承(day08)的更多相关文章
- Python中的操作符重载
运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果. 类可以重载python的操作符 操作符重载使我们的对 ...
- Python学习手册之内部方法、操作符重载和对象生命周期
在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...
- python——操作符重载(重要)
类可以重载python的操作符 旧认识:__X__的名字 是系统定义的名字:是python特殊方法专用标识. 操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook) ...
- lua 14 metatable (类似操作符重载)
转自:http://www.runoob.com/lua/lua-metatables.html 感性认识: “Lua中Metatable这个概念, 国内将他翻译为元表. 元表为重定义Lua中任意一个 ...
- c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...
- paip.操作符重载的缺失 Java 的一个大缺点
paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如 java代码会直接移植到 ...
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 操作符重载.xml
pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
随机推荐
- OpenCV 学习(计算图像的直方图)
OpenCV 计算图像的直方图 计算图像的直方图是图像处理领域一个非经常见的基本操作. OpenCV 中提供了 calcHist 函数来计算图像直方图.只是这个函数说实话挺难用的,研究了好久才掌握了些 ...
- xpath元素查找提示is not clickable
1.用xpath可以在chrome找到 $x("//mandatory-config-dialog[@is-show='isShowMandatoryConfig']/div/div[2]/ ...
- STL_算法_填充新值(fill、fill_n、generate、generate_n)
C++ Primer 学习中... 简单记录下我的学习过程 (代码为主) 全部容器适用 fill(b,e,v) //[b,e) 填充成v fill_n(b,n,v) ...
- 利用jquery将页面中所有目标为“#‘的链接改为其他URL
有一张页面草稿,开始时为了方便,里面差不多所有的<a>都指向了"#".现在要修改为另一个地址,难道要全部修改吗?用jquery 改改就好.代码如下: <scrip ...
- 粗结MySql数据库基础知识点之一
首先弄什么是数据库? 数据库就是用来存储和管理数据的仓库. 数据库存储数据的优点: 1.可存储大量的数据 2.方便检索 3.保持数据的一致性,完整性 4.安全 可共享 5.通过组合分析,可以产 ...
- android.os.Process.killProcess(android.os.Process.myPid())与Activity生命周期的影响
如果通过finish方法结束了一个Activity,那么根据Activity的生命周期,则会自动调用Activity的销毁方法onDestory(),但是在项目中遇到这样的一个问题,就是Activi ...
- Google Deepmind AI tries it hand at creating Hearthstone and Magic: The Gathering cards
http://www.techrepublic.com/article/google-deepmind-ai-tries-it-hand-at-creating-hearthstone-magic-t ...
- canvas制作饼图和环形图,使用Excanvas兼容IE67
excanvas 地址:http://excanvas.sourceforge.net/ <!DOCTYPE html> <html> <head> <met ...
- ZOJ 2314 无源汇可行流(输出方案)
Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge The terrorist group leaded by a ...
- hdu1533 费用流模板
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...