【C++】多态(一):重载多态笔记

多态和动态绑定->(支持)->将派生类对象当成基类对象使用

1. 多态概述

多态:同样的消息不同的类型的对象接受时导致不同的行为
消息 :对类的成员函数的调用。
不同的行为:不同的实现,调用了不同函数

2. 多态类型(4种)

  1. 重载多态:普通函数、类中成员函数
  2. 强制多态:类型变化
  3. 包含多态:定义【类族】中不同类的同名成员函数(虚函数实现)
  4. 参数多态:与类模板相关联,由类模板实例化的各个类具有相同的操作,而操作对象类型不同

3. 多态实现

  1. 编译时多态:编译中确定同名操作的具体操作对象(绑定)——静态绑定(确定工作在编译连接阶段)
  2. 运行时多态:程序运行中动态确定同名操作的具体操作对象——动态绑定(确定工作在程序运行阶段)

绑定:计算机程序自身彼此关联(一个标识符 和 一个存储地址 联系/一条消息 和 一个对象 相结合)
运行时多态

4. 运算符重载

定义:对已有的运算符赋予多重定义,使得同一个运算符作用域不同类型的数据时导致不同的行为
实质:函数重载
实现:(编译中完成)
step1: 指定的运算表达式——>对运算符函数的调用,
step2: 运算对象——>运算符函数的实参
step3: 根据实参类型——>确定需要调用的函数
规则:

  1. 类属运算符‘.’ 成员指针运算符’.’ 作用域分辨符 ‘::*’ 三目运算符 ‘: ?’ (不可重载)
  2. 重载后,优先级和结合性不能改变
  3. 重载功能与原有功能相似,不能改变元运算符的操作个数,至少要有一个操作对象是自定义类型

重载形式(2):

  1. 重载为类的非静态成员函数
    返回类型 operator 运算符(形参表){ 函数体 }
  2. 重载为非成员函数
    返回类型 operator 运算符(形参表){ 函数体 }

示例:

#include<iostream>
using std::istream;
using std::ostream;
class CA
{
	int a;
public:
	CA(){};//无参构造
	CA(int a){this->a = a;}//带参构造
public:
	CA operator+(CA const& srcCA) const;//operator+ 来表示函数名
	//参数列表,因为通过对象的成员函数来实现运算符重载,所以this算一个参数,也只能是第一个参数
	CA operator-(CA const& srcCA) const;
	CA& operator++();//++前置
	CA operator++(int);//++后置,int表示修饰 
	/**第一个参数是输入输出流,不是this类型,类型不匹配,重载不能写进类内*/
	friend CA operator*(CA const& srcCA,CA const& srcCB);//不属于该类,可以传入两个参数,没有this指针
	friend ostream& operator<<(ostream& os,CA const& srcCA);//输出重载
	friend istream& operator>>(isstream& os, CA &srcCA);//无const,修改CA
}
运算符+重载
CA CA::operator+(CA const& srcCA) const//返回类对象
{
	CA z;
	z.a = this->a +srcCA.a;
	return z;
}
运算符-重载
CA CA::operator-(CA const& srcCA) const//返回类对象
{
	CA z;
	z.a = this->a -srcCA.a;
	return z;
}
运算符++前置 重载
CA& CA::operator+()//++前置
{
	a++;
	return *this
}
运算符* 重载(友元)
CA operator*(CA const& srcCA,CA const& srcCB)
{
	CA z;
	z.a = srcCA.a * srcCB.a;
	return z;
}
运算符++后置 重载
CA CA::operator++(int)//++后置
{
	CA z = *this;//先备份
	a ++;
	return z;
}
输出流 重载
ostream& operator<<(ostream& os, CA const& scrCA)
{
	os<<srcCA.a;
	return os;
}
输入流 重载
istream& operator>>(istream& is,CA& srcCA)
{
	is>>srcCA.a;
	return is;
}

调用:


int main{
	CA x(1);
	CA y(1);
	CA m = x+y;//拷贝构造的隐式调用 x+y CA对象的+运算符的符号调用
	CA n(x.operator+(y));//拷贝构造的显示调用  x.operator+(y):CA对象的+运算符的函数调用
	CA K = x*y;//友元描述,可用符号调用,不可按成员函数调用
	++m;
}

5.小结

  1. 运算符实际上是函数的一种简化形式,在类中和结构中
  2. 理解类中成员函数,this作为隐含参数 对照 友元定义
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值