一、多态的概述
1.多态的类型
重载多态,包含多态,强制多态和参数多态
2.多态的实现
实现的角度:(1)编译时的多态
在编译中的过程中确定了同名操作的具体操作对象
(2)运行时的多态
在程序的运行过程中才动态地确定操作所针对的具体对象(其过程为绑定)
绑定:计算机程序自身彼此关联的过程,就是把一个标识符名和一个存储地址联系在一起的过程
(用UML的术语解释:把一条消息和一个对象的方法相结合的过程)
绑定的方法:1.静态绑定
绑定工作在编译连接阶段完成的情况
2.动态绑定
绑定工作在程序运行阶段完成的情况
二、运算符重载
2、运算符重载的规则
(1)只重载c++中大部分已经有的运算符
(2)重载后运算符的优先级和结合性都不会发生改变
(3)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。
类属性关系运算符“.”,成员指针运算符“.*”,作用域分辨符“::”,三目运算符“?:” 这四种操作符不能重载
运算符的重载形式有两种 :非静态成员函数和非成员函数函数。
语法:
返回类型 operator 运算符(形参表)
{ 函数体 }
operator 为关键字
三、运算符重载是成员函数或非成员函数
#include<iostream>
using namespace std;
class A{
int x; //c++中默认x为私有类型
public:
A(int i):x(i){} //构造函数
void print(); //输出函数
A &operator++(); //重载前置运算符++ 如;有一个对象a ,进行++a(3);
A operator++(int); //重载后置运算符++ 如;有一个对象a ,进行a(3)++;
};
A &A::operator++()
{ x++;
return *this;
}
A A::operator++(int)
{ A b=*this; //创建一个临时的A类的对象b ,用来存放初始的对象 如: a(3)++;将a(3)未自增时的内容赋给对象b,此时的 *this为a(3)
++(*this); //经过此语句后,*this 为 a(3)++; 通俗的将就是 a(3)自增后的内容就是 *this的值
return b; //这返回的是b,也就是a(3)未自增是的值
}
void A::print(){ cout<<"此刻的对象数据成员x的值为"<<x<<endl; }
int main()
{
A a(3);
a.print();
(a++).print();
a.print();
(++a).print();
a.print();
return 0;
}
运算符为非成员函数