面向对象的三大特征:
1.封装:保证对象自身数据的完整性、安全性
2.继承:建立类之间的关系,实现代码复用、方便系统的扩展
3.多态:相同的方法调用可实现不同的实现方式。多态是指两个或多个属于不同类的对象,对于同一个消息(方法调用)作出不同响应的方式。
、、、、、、、、、
实现多态的方式:
函数重载;运算符重载;虚函数
、、、、、、、、、
C++有两种多态:
1.编译时的多态:函数重载和运算符重载,在编译时就决定调用哪个函数
2.运行时的多态:通过类继承和虚函数实现的。
、、、、、、、、
函数重载包括:普通函数重载和成员函数重载。函数的参数个数、类型、顺序不同
运算符重载:实现两个对象的相加。
、、、、、、、、
当基类中的某个函数被定义为虚函数之后,该函数可以在一个或多个派生类中重新定义,但其函数原型,包括返回值类型,参数个数,参数类型和参数顺序都必须和基类中的一致。
多态性是面向对象程序设计的重要特征之一。它与封装性和继承性共同构成了面向对象程序设计的三大特征。封装性是基础 ,继承性是关键 ,多态性是补充 ,多态性又存在于继承的环境之中 ,所以这三大特征是相互关联的 ,相互补充的。C++ 语言中有两种重载 :函数重载和运算符重载。运算符重载很重要 ,它的实质就是函数重载。我们接触的还有另一种是指同样的消息被不同类的对象接受时产生完全不同的实现 ,该情况大多产生在多类继承中不同类中的相同说明的成员函数的多态行为。
在函数重载中 ,同一个函数名可对应若干种不同的实现 ,依据函数参数的类型、个数和顺序来确定某个实现。在运算符重载中 ,同一个运算符对应着很多种功能 ,这些功能是通过函数来定义的 ,依据操作数的类型来确定应选运算符的功能。
函数重载主要是针对不同参数类型,参数个数,参数顺序的处理,处理类型的最好不用函数重载,可以用模板函数更简便运算符重载是解决类的对象的运算,由operator定义多态性是用虚函数和类的继承来实现的,通过基类的指针或引用调用派生类的对象他们各有各的功能。重载主要是指同一个函数名拥有不一样的参数表来实现多个功能,多态是用父类来操控不同的子类。
多态性是面向对象程序设计的一个强大的功能,是其三大特性之一。
运算符重载和函数重载体现了面向对象技术的多态性。多态性机制不仅增加了面向对象软件系统的灵活性,进一步减少了冗余信息,而且显著提高了软件的可重用性和可扩充性。从实现的角度来讲,多态性可以划分为两类:编译时的多态性和运行时的多态性。在C++语言中,编译时的多态性主要是通过函数重载和运算符重载实现的。
C++是面向对象的编程语言,引入了类操作的时候如果一个类的两个对象相加,如果你简单的将其的每一项相加,这不又回到了面向过程了吗,所以就要使两个对象也能相加,所以这时候就要重载操作符。 一个简单的程序,用的重载运算符+,让两个对象相+,这就是面向对象的c++语言。
参数传递有传值、传址和引用三种
void f(int n){}//定义传值方式
int a;
f(a);//调用传值方式
void f(int *n){}//定义传址方式
int a;
f(&a);//调用传址方式
void f(int &n){}//定义引用方式
int a;
f(a);//调用引用方式
传值方式适合一般数值传送,并且不改变原数据,但要消耗内存空间
传址方式适合传递数组、指针,由于传递的是地址,所以直接操作会改变原数据
引用方式和指针比较类似,是相对比较新的一种方式,一般情况下能用传址的就能用引用,而且用引用更方便一点。
要体现面向对象的多态性不是传递方式的原因,是函数重载。
即同一函数名可以定义不同的副本,在对不同调用时有不同的反应
如:
void f(){}//不带参数
void f(int a){}//带一个整形参数
void f(int a,int b)//带两个整形参数
void f(double a){}//带一个double型参数
void f(char a){}//带一个字符型参数
以下依次对它们调用:
f();
int a;
f(a);
int a1,a2;
f(a1,a2);
double b;
f(b);
char c;
f(c);
区别函数重载可以是
参数类型(整形、实型、字符型等)
参数个数
但不能是返回类型,如:
int f(){}
double f(){}
这样是不行的,编译要出错。