文档详情

Chapt-4-运算符重载.ppt

发布:2018-07-03约6.52千字共44页下载文档
文本预览下载声明
第4章 运算符重载 基本内容 4.1 运算符重载的概念 4.2 运算符重载的方法 4.3 运算符重载的规则 4.4 运算符重载函数作为成员函数与友元函数 4.5 双目运算符重载 4.6 单目运算符重载 4.7 输入输出运算符重载 4.8 不同数据类型之间的转换(涉及类继承的转换在继承与派生中讲述) 4.1 运算符重载的概念 4.1 运算符重载的概念 和函数重载类似,只不过运算符重载的“函数“是一个运算符罢了! 如:+ - * / ++ -- 都可通过重载赋予它们新的含义! 4.2 运算符重载的方法 4.2 运算符重载的方法 函数类型 operator 运算符名称 (形参表){函数体} CComplex operator - (CComplex c1)重载了减法运算符 CComplex operator -()重载了负号运算符 CComplex operator ++(int)重载了后置++运算符 CComplex operator ++()重载了前置++运算符 4.3 运算符重载的规则 4.3 运算符重载的规则 不能自定义新的运算符 重载运算符无法改变任何运算符的优先级与结合性质; 重载运算符不可改变运算符的操作数个数; 使用重载运算符,操作数之一必须为对象或对象引用 重载运算符=不可使用缺省参数; 除了赋值运算外,重载运算符可由派生类继承下去; 运算符=、()、[]和-必须为类成员运算符,不可作为友元运算符。而输入输出 、类型转换不能作为成员函数。 应用运算符重载的前提应该是保证运算符的语法与语义习惯,因而运算符重载主要用于与数学相关的领域。在其他情况下,使用有含义的标识符作为函数名字比运算符更容易理解与掌握。 以下五个运算符不能重载:. :: ?: .* sizeof 4.4 运算符重载为成员函数和友元函数 4.4.1 运算符函数(1) 运算符可以理解为一个函数。如 5+8可以理解为二元函数+(5,8),“+”作为加法函数名。 对于程序员自己定义的类类型,在一些情况下如果能直接用运算符代替函数名,更容易理解,与基本数据类型的使用风格保持一致。 例如复数相加、矩阵相加、字符串连接等操作也可用“+”表示,且函数调用也写成可作复合运算的加法表达式,那么程序员就可以用更加自然的方式使用新定义的类类型。 4.4.1 运算符函数(2) 运算符实际上是函数的特殊形式,C++语言允许运算符的语义由程序员重新定义,这一机制称为运算符重载,而这些由程序员自己重新定义的运算符又称运算符函数。 类成员运算符:在类中定义的运算符成员函数。 友元运算符:在类之外定义的运算符函数。 也可以作为普通函数重载(很少用) 4.4.2 类成员运算符重载(1) 类成员运算符重载的一般形式为: 类型 类名::operator 运算符(参数表) { //运算符函数体 } 其中,尽管运算符函数的返回值类型可以是任意的,但一般设计为当前的类类型以便进行复合运算。与重载函数不同,运算符函数的参数受到所重载的运算符的约束,不可随意指定 4.4.2 类成员运算符重载(2) 运算符重载函数的函数名必须为关键字 operator 加一个合法的运算符 在 调用该函数时,将右操作数作为函数的实参。 当用类的成员函数实现运算符的重载时,运算符重载函数的参数(当为双目运算符时)为一个或(当为单目运算符时)没有。运算符的左操作数一定是 对象,因为重载的运算符是该对象的成员函数,而右操作数是该函数的参数, 其类型并无严格限制。 4.5 重载双目运算符 4.5 重载双目运算符 通过实例讲解+, *等运算符的重载. 4.6 重载单目运算符 4.6 重载一元运算符(1) 前置“++”格式为: 返回类型 类名 ::operator++(){……} 后置“++”格式为:返回类型 类名 ::operator++(int){……} 后置“++”中的参数 int 仅用作区分,并无实际意义,可以给一个变量名,也可以不给变量名。 4.6 重载一元运算符(2) #include iostream using namespace std; class Count{ public: Count(){v=0;} Count operator ++(); Count operator ++(int); void print(){coutvendl;} private: unsigned v; }; 4.6 重载一元运算符(3) 重载定义前缀和后缀操作符时存在一个问题,它们的形参数目、类型都一样,这样重载时不能区分定义的是前缀还是后缀操作符。 因此,规定后缀操作符接受一个额外的int形参。使用时,编译器提供一个0作为这个形参的实参。这个int形参对定义的实现
显示全部
相似文档