c语言中各种运算符的运算方法(运算符重载讲解与经典实例)
c语言中各种运算符的运算方法(运算符重载讲解与经典实例)例2 重载函数作为Complex类的友元函数运算符重载函数可以是类的成员函数,也可以是类的友元函数,也可以是普通函数(不推荐)。class Complex分析:C 编译系统将程序中的表达式c1 c2解释为: c1.operator (c2)即以c2为实参调用对象c1的运算符重载函数operator (Complex &c2)。实际上,运算符重载函数有两个参数,由于重载函数是Coplex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员,如this->real c2.real,this代表c1,即实际上是c1.real c2.real。
C 运算符重载
“<<”和“>>”本来是在C 中被定义为左/右位移运算符的,由于在iostream头文件中对它们进行了重载,所以使用它们能用作标准数据类型数据的输入和输出运算符。因此,在使用它们的程序中必须包含:#include <iostream>
1. 运算符重载例子:
例1重载函数作为Complex类的成员函数
class Complex
分析:C 编译系统将程序中的表达式c1 c2解释为:
c1.operator (c2)
即以c2为实参调用对象c1的运算符重载函数operator (Complex &c2)。实际上,运算符重载函数有两个参数,由于重载函数是Coplex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员,如this->real c2.real,this代表c1,即实际上是c1.real c2.real。
运算符重载函数可以是类的成员函数,也可以是类的友元函数,也可以是普通函数(不推荐)。
例2 重载函数作为Complex类的友元函数
friend Complex operator (Complex &c1 Complex &c2); //声明
为什么把运算符函数作为友元函数呢?理由很简单,因为运算符函数要访问Complex类对象中的成员。如果作为成员函数,就必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象,而且与运算符函数的类型相同,在例1中,表达式c1 c2中的第一个参数c1是Complex类对象,运算符函数返回值的类型也是Complex,这是正确的。如果c1不是Complex类,就无法启用c1.operator (c2),也就无法通过隐式this指针访问Complex类的成员了。
Teacher(Student &s)
{ num=s.num; strcpy(name s.name); sex=s.sex; }
但应注意:对象s中的num name sex必须是公用成员,否则不能被类外调用。
c. 用类型转换函数进行类型转换
用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。C 提供了类型转换函数来解决这个问题。类型转换函数的作用是将一个类的对象转换成另一类型的数据。如果已经声明了一个Complex类:
class Complex
可以在Complex类中这样定义类型转换函数:
operator double()
{ return real; }
它的作用是将一个Complex类对象转换为一个double型数据,其值是Complex类中得数据成员real的值。请注意:函数名是operator double。这点是和运算符重载时的规律一致的(都是用关键字operator开头,只是被重载的是类型名)。其特点:在函数名前面不能指定函数类型,函数也没有参数。其返回值的类型是由函数名中指定的类型名来确定的(函数返回double型变量real的值)。
在定义了前面的数据类型转换函数后,程序中的Complex类对象是不是一律都转换成double类型的数据呢?不是的,它们具有双重身份,既是Complex类对象,又可以作为double类型数据。
转换构造函数和类型转换运算符有一个共同的功能:当需要的时候,编译系统会自动的调用这些函数,建立一个无名的临时对象(或临时变量)。例如,若已定义d1 d2为double型变量,c1 c2为Complex类对象,且类中已经定义了类型转换函数。设程序中有以下表达式:
d1 = d2 c1;
编译系统发现“ ”左侧的d2是double型,而右侧的c1是Complex类对象,如果没有对运算符“ ”进行重载,就会检查有无类型转换函数,结果发现有,就调用operate double函数把Complex类对象c1转换为double型数据,建立了一个临时的double变量,并与d2相加,最后将一个double的值赋给d1。相当于执行表达式:
d1 = d2 c1.operate double();
如果类中已经定义了转换构造函数并重载了运算符“ ”(作为Complex类的友元函数),但未对double定义类型转换函数(或者说未对double重载),若有以下表达式:
c2 = c1 d2;
则系统将转换为:
c2 = c1 Complex(d2);
当然,如果既有转换构造函数和运算符重载,又有double类型转换函数,出现歧义的话就会出错。