金融网站模板免费下载,手工制作代加工接单网,godaddy 搭建网站,建设网站企业注册人员C 重载运算符和重载函数
C 重载运算符和重载函数
C 允许在同一作用域中的某个函数和运算符指定多个定义#xff0c;分别称为函数重载和运算符重载。
重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明#xff0c;但是它们的参数列表和定义 重载运算符和重载函数
C 重载运算符和重载函数
C 允许在同一作用域中的某个函数和运算符指定多个定义分别称为函数重载和运算符重载。
重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明但是它们的参数列表和定义实现不相同。
当您调用一个重载函数或重载运算符时编译器通过把您所使用的参数类型与定义中的参数类型进行比较决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程称为重载决策。
C 中的函数重载
在同一个作用域内可以声明几个功能类似的同名函数但是这些同名函数的形式参数指参数的个数、类型或者顺序必须不同。您不能仅通过返回类型的不同来重载函数。
下面的实例中同名函数 print() 被用于输出不同的数据类型
#include iostream
using namespace std;class printData
{public:void print(int i) {cout Printing int: i endl;}void print(double f) {cout Printing float: f endl;}void print(string c) {cout Printing character: c endl;}
};int main(void)
{printData pd;// Call print to print integerpd.print(5);// Call print to print floatpd.print(500.263);// Call print to print characterpd.print(Hello C);return 0;
}
尝试一下 当上面的代码被编译和执行时它会产生下列结果
Printing int: 5
Printing float: 500.263
Printing character: Hello CC 中的运算符重载
您可以重定义或重载大部分 C 内置的运算符。这样您就能使用自定义类型的运算符。
重载的运算符是带有特殊名称的函数函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样重载运算符有一个返回类型和一个参数列表。
Box operator(const Box);声明加法运算符用于把两个 Box 对象相加返回最终的 Box 对象。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们定义上面的函数为类的非成员函数那么我们需要为每次操作传递两个参数如下所示
Box operator(const Box, const Box);下面的实例使用成员函数演示了运算符重载的概念。在这里对象作为参数进行传递对象的属性使用 this 运算符进行访问如下所示
#include iostream
using namespace std;class Box
{public:double getVolume(void){return length * breadth * height;}void setLength( double len ){length len;}void setBreadth( double bre ){breadth bre;}void setHeight( double hei ){height hei;}// 重载 运算符用于把两个 Box 对象相加Box operator(const Box b){Box box;box.length this-length b.length;box.breadth this-breadth b.breadth;box.height this-height b.height;return box;}private:double length; // 长度double breadth; // 宽度double height; // 高度
};
// 程序的主函数
int main( )
{Box Box1; // 声明 Box1类型为 BoxBox Box2; // 声明 Box2类型为 BoxBox Box3; // 声明 Box3类型为 Boxdouble volume 0.0; // 把体积存储在该变量中// Box1 详述Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0);// Box2 详述Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0);// Box1 的体积volume Box1.getVolume();cout Volume of Box1 : volume endl;// Box2 的体积volume Box2.getVolume();cout Volume of Box2 : volume endl;// 把两个对象相加得到 Box3Box3 Box1 Box2;// Box3 的体积volume Box3.getVolume();cout Volume of Box3 : volume endl;return 0;
} 当上面的代码被编译和执行时它会产生下列结果
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400可重载运算符/不可重载运算符
下面是可重载的运算符列表
-*/%^|~!,--!||-/%^|*[]()--*newnew []deletedelete []
下面是不可重载的运算符列表
::.*.?:
运算符重载实例
下面提供了各种运算符重载的实例帮助您更好地理解重载的概念。
序号运算符和实例1一元运算符重载2二元运算符重载3关系运算符重载4输入/输出运算符重载5 和 -- 运算符重载6赋值运算符重载7函数调用运算符 () 重载8下标运算符 [] 重载9类成员访问运算符 - 重载 C 多态
C 多态
多态按字面的意思就是多种形态。当类之间存在层次结构并且类之间是通过继承关联时就会用到多态。
C 多态意味着调用成员函数时会根据调用函数的对象的类型来执行不同的函数。
下面的实例中基类 Shape 被派生为两个类如下所示
#include iostream
using namespace std;class Shape {protected:int width, height;public:Shape( int a0, int b0){width a;height b;}int area(){cout Parent class area : endl;return 0;}
};
class Rectangle: public Shape{public:Rectangle( int a0, int b0):Shape(a, b) { }int area (){ cout Rectangle class area : endl;return (width * height); }
};
class Triangle: public Shape{public:Triangle( int a0, int b0):Shape(a, b) { }int area (){ cout Triangle class area : endl;return (width * height / 2); }
};
// 程序的主函数
int main( )
{Shape *shape;Rectangle rec(10,7);Triangle tri(10,5);// 存储矩形的地址shape rec;// 调用矩形的求面积函数 areashape-area();// 存储三角形的地址shape tri;// 调用三角形的求面积函数 areashape-area();return 0;
} 当上面的代码被编译和执行时它会产生下列结果
Parent class area :
Parent class area :导致错误输出的原因是调用函数 area() 被编译器设置为基类中的版本这就是所谓的静态多态或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定因为 area() 函数在程序编译期间就已经设置好了。
但现在让我们对程序稍作修改在 Shape 类中area() 的声明前放置关键字 virtual如下所示
class Shape {protected:int width, height;public:Shape( int a0, int b0){width a;height b;}virtual int area(){cout Parent class area : endl;return 0;}
}; 修改后当编译和执行前面的实例代码时它会产生以下结果
Rectangle class area
Triangle class area此时编译器看的是指针的内容而不是它的类型。因此由于 tri 和 rec 类的对象的地址存储在 *shape 中所以会调用各自的 area() 函数。
正如您所看到的每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态您可以有多个不同的类都带有同一个名称但具有不同实现的函数函数的参数甚至可以是相同的。
虚函数
虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数这种操作被称为动态链接或后期绑定。
纯虚函数
您可能想要在基类中定义虚函数以便在派生类中重新定义该函数更好地适用于对象但是您在基类中又不能对虚函数给出有意义的实现这个时候就会用到纯虚函数。
我们可以把基类中的虚函数 area() 改写如下
class Shape {protected:int width, height;public:Shape( int a0, int b0){width a;height b;}// pure virtual functionvirtual int area() 0;
}; 0 告诉编译器函数没有主体上面的虚函数是纯虚函数。