操作符重载、继承(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(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
随机推荐
- linux 进程通信之 共享内存
共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法.一个进程向共享内存区域写入了数据,共享这个内存区域的全部进程就能够立马看到当中的内容. 关于共享内存使用的API k ...
- 菜鸟学Java(二十二)——又一次认识泛型
泛型是Java SE 1.5的新特性,泛型的本质是參数化类型,也就是说所操作的数据类型被指定为一个參数.这样的參数类型能够用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言 ...
- MapReduce编程实战之“高级特性”
本篇介绍MapReduce的一些高级特性,如计数器.数据集的排序和连接.计数器是一种收集作业统计信息的有效手段.排序是MapReduce的核心技术,MapReduce也可以运行大型数据集间的" ...
- CSS制作响应式正方形及其应用
CSS制作响应式正方形?什么鬼?干嘛用的?干嘛用的没人有每人的需求,本人也正好是由于公司正在做的业务须要,想做个照片展示的功能(当然得符合响应式了).而这个照片展示必须符合下面几点功能:1.用三张图片 ...
- 【Ubuntu】基本操作 (条目=11)
定义 NAME 为要操作的对象名 定义 DIR 为文件所在的绝对路径 所有操作默认在普通用户下进行 所有软件包默认是指Debian包(deb包) 1.查看进程 top 2.强制结束进程 PID由top ...
- POJ 3264 Balanced Lineup (线段树)
Balanced Lineup For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the s ...
- Java 接口(interface)的三种类型
放入接口中的任何域(成员变量)都自动是 static 和 final 的: 1. 包含抽象方法的常规接口 2. 全部是常量的 接口类中的方法和属性不要添加任何修饰符号(public 也不需要). 因为 ...
- Nearest-Neighbor Methods(ESL读书笔记)
Nearest-neighbor methods use those observations in the training set T closest in input space to x f ...
- Redis(五)-数据库
Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以将制定的书存储在哪个字典中,这与关系书库实例中可以i创建多个数据库类似,所以可以将其中的每个字典 ...
- [DP专题]悬线法
参考:https://blog.csdn.net/twtsa/article/details/8120269 先给出题目来源:(洛谷) 1.p1387 最大正方形 2.P1169 棋盘制作 3.p27 ...