网站项目流程表,广告关键词有哪些,网络营销理论与实务,wordpress 免费建站**多态是指同样的消息被不同类型的对象接收时导致不同的行为。**所谓的消息是指对类的成员函数的调用#xff0c;不同的行为是指不同的实现#xff0c;也就是调用了不同的函数。
使用同样的“”#xff0c;就实现了整数之间、浮点数之间、双精度浮点数之间的加法#xff0…**多态是指同样的消息被不同类型的对象接收时导致不同的行为。**所谓的消息是指对类的成员函数的调用不同的行为是指不同的实现也就是调用了不同的函数。
使用同样的“”就实现了整数之间、浮点数之间、双精度浮点数之间的加法以及这几种数据类型混合的加法运算。在这里同样的消息——相加被不同类型的对象——变量接收后不同类型的变量采用不同的方式进行加法运算。如果时不同类型的变量相加例如浮点数和整型数相加需先将整型数转换为浮点数然后再进行加法运算这就是典型的多态现象。
多态的类型
面向对象的多态性分为4类重载多态、强制多态、包含多态和参数多态。重载多态和强制多态称为专用多态包含多态和参数多态称为通用多态。 1普通函数及类的成员函数的重载属于重载多态浮点数之间、整型数之间的加法运算也属于重载多态。 2强制多态是指将一个变元的类型加以变化以符合一个函数或操作的要求比如加法运算符在进行浮点数与整型数之间的相加时首先进行类型强制转换把整型数变为浮点数之后再相加的情况就是强制多态。 3包含多态是类族中定义于不同类中的同名成员函数的多态行为主要是通过虚函数来实现。 4参数多态与类模板相关联在使用时必须赋予实际的类型才可以实例化。这样由类模板实例化的各个类都具有相同的操作而操作对象的类型却不同。
多态的实现
多态从实现的角度分为两类编译时多态和运行时多态。
编译时的多态是在编译过程中确定了同名操作的具体操作对象而运行时的多态是在程序运行过程中才动态地确定操作所针对的具体对象。这种确定操作所针对的具体对象的过程就是绑定。绑定是指计算机程序自身彼此关联的过程也就是把一个标识符名和一个存储地址联系在一起的过程就是把一条消息和一个对象的方法相结合的过程。
按照绑定进行的阶段的不同绑定分为静态绑定和动态绑定。这两种绑定分别对应着多态的两种实现方式编译时多态和运行时多态。
静态绑定绑定工作在编译连接阶段完成的情况。 动态绑定绑定工作在程序运行阶段完成的情况。
运算符重载
C中预定义的运算符的操作对象只能是基本数据类型。实际上对于很多用户自定义类型比如说类也需要有类似的运算操作。
例如下面的程序定义了一个复数类
class Complex
{
public:Complex(double r 0.0, double i 0.0) :real(r), imag(i){}void show()const;
private:double real;double imag;
};于是可以这样声明复数类对象
Complex a(10,20),b(5,8);接下来如果对a和b进行加法运算写出表达式“ab”这时编译出错因为编译器不知道如何完成这个加法运算。这时候就需要自己编写程序来说明“”在作用于Complex对象时该实现什么功能这就是运算符重载。
运算符重载是对已有的运算符赋予多重含义使同一个运算符作用于不同类型的数据时导致的不同的行为。
1.运算符重载的实质就是函数重载
比如说整型类型的两个数相加
int a2,b3;
int c;
cab;上述代码中的cab;就相当于
ca.(b);或者
c(a,b);在实现过程中先把指定的表达式转换为对运算符函数的调用将运算对象转换成运算符函数的实参然后根据实参类型来确定需要调用的函数这个过程是在编译过程中完成的。
2.运算符重载的规则
1规则如下 ①C中的运算符除了少数几个之外全部可以重载而且只能重载C中已经有的运算符。 ②重载之后运算符的优先级和结合性都不改变。 ③运算符重载是针对新类型数据的实际需要对原有运算符进行适当的改造。一般来讲重载的功能应当与原有的功能相类似不能改变原运算符的操作对象的个数同时至少有一个操作对象是自定义。
C标准规定有些操作符不可以重载它们是类属关系运算符“.”、成员指针运算符“.*”、作用域分辨符“::”和三目运算符“?:”。 类属关系运算符“.”和成员指针运算符“.*”保证了C中访问成员功能的含义不被改变。作用域分辨符的操作数是类型而不是普通的表达式也不具备重载特征。
2运算符重载的形式 ①重载为类的非静态成员函数 ②重载为非成员函数。
运算符重载为类的非静态成员函数的一般语法形式
返回类型 operator运算符(形参表)
{函数体
}运算符重载非成员函数的一般语法形式
返回类型 operator运算符(形参表)
{函数体
}返回类型指定了重载运算符的返回值类型也就是运算结果类型operator是定义运算符重载函数的关键字运算符是要重载的运算符名称必须是C中可重载的运算符比如要重载加法运算符这里就写“”形参表中给出重载运算符所需要的参数和类型。
【注意】当以非成员函数形式进行重载运算符时有时需要访问运算符参数所涉及类的私有成员这时可以把该函数声明为类的友元函数。
当运算符重载为类的成员函数时函数的参数个数比原来的操作数个数要少一个后置“”“–”除外当重载为非成员函数时参数个数与原操作数个数相同。这两种情况的参数个数有所差异的原因是重载为类的成员函数时第一个操作数会被作为函数调用的目的对象因此无须出现在参数表中在函数体中可以直接访问第一个操作数的成员而重载非成员函数时运算符的所有操作数必须显式通过参数传递。
3运算符重载的优点 可以改变现有运算符的操作方式以用于类类型使得程序看起来更加直观