vc 04 运算符重载

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

friend type operator@(参数表 参数表) 参数表 {
相对于该类而定义的操作(运算符重载函数体 相对于该类而定义的操作 运算符重载函数体) 运算符重载函数体
}
单目运算符重载,参数表中只有一个形参数; 单目运算符重载,参数表中只有一个形参数; 双目运算符重载,参数表中有两个形参数. 双目运算符重载,参数表中有两个形参数. 运算符重载为成员函数和友元函数形式的主要区别在于前者 指针,后者无this 指针. 指针. 有this 指针,后者无
inline Complex Complex::operator+(const Complex& c)
{
return Complex(real+c.real,imag+c.imag);
}
inline Complex Complex::operator-(const Complex& c)
{
return Complex(real-c.real,imag-c.image);
::(Scope resolution); . (Member selection); ->(Member selection through pointer to member); ?:(Conditional expression).
2,运算符重载要保持原运算符的下述特性不变: 运算符重载要保持原运算符的下述特性不变: 优先级和结合性不变; 优先级和结合性不变; 操作数个数不变; 操作数个数不变; 语法结构不变. 语法结构不变. 3,运算符重载实际上是通过定义一个函数来实现的.运算符重 运算符重载实际上是通过定义一个函数来实现的. 载归根结底是函数的重载.编译器选择重载的运算符是遵循函 载归根结底是函数的重载. 数重载的选择原则, 数重载的选择原则,即按不同类型或个数的参数来选择不同的 重载运算符. 重载运算符. 4,运算符重载应符合使用习惯,便于理解.如果在字符串类中 运算符重载应符合使用习惯,便于理解. 把"*"运算符重载为两个对象的合并操作,就不如把"+"运 "运算符重载为两个对象的合并操作,就不如把" 运 算符重载,更易于理解. 算符重载,更易于理解. 5,运算符重载不能创造新的运算符号.例如,不能创造一个新 运算符重载不能创造新的运算符号.例如, 运算符号" " 表示幂运算. 运算符号"**",表示幂运算.
void Counter::operator--( )
{ }
if(value>0)
value--;
unsigned int Counter:operator( )( )
{ }
return value;
main()
{
Counter mycounter; for(int i=0; i<12;i++)
{
于是: 于是:
string x,y; x=x+y; //表示串 和串 合并,放入串 表示串x 表示串 和串y 合并,放入串x
这就使对基本类型的预定义运算符" 的含义在串类中被扩展 这就使对基本类型的预定义运算符"+"的含义在串类中被扩展 为对串类对象的合并操作,即运算符"+"被重载. 为对串类对象的合并操作,即运算符" 被重载. 被重载 运算符重载应注意的几个问题: 运算符重载应注意的几个问题: 1,哪些运算符可以重载? 哪些运算符可以重载? 中除了下面四种运算符外, 在C++ 中除了下面四种运算符外,系统预定义的运算符都 能被重载. 能被重载.
operator 为关键字; 为关键字; operator@为函数名. 为函数名.
参数表列出该运算符需要的操作数.单目运算参数表中 参数表列出该运算符需要的操作数. 无参数,调用该函数的对象为操作数. 无参数,调用该函数的对象为操作数.双目运算参数表中有一 个参数,调用该函数的对象为第一操作数, 个参数,调用该函数的对象为第一操作数,参数表中的参数为 第二操作数. 第二操作数. 运算符函数体对重载的运算符的含义作出新的解释. 运算符函数体对重载的运算符的含义作出新的解释.这种 解释仅局限在重载该运算符的类中,即当在X类对象的关联中 类对象的关联中, 解释仅局限在重载该运算符的类中,即当在 类对象的关联中, 运算符含义由函数体解释;否则脱离类对象, 运算符含义由函数体解释;否则脱离类对象,该运算符具有系 统预定义的含义. 统预定义的含义.
应用程序中的表达式
<对象A><运算符>(<实际参数>) 例:Complex A,B; A+B;
编译系统内部表示
operater<运算符>(对象A, 实际参数) 例:operater+(A,B)
运算符重载函数可以定义为友元函数的形式,格式如下: 运算符重载函数可以定义为友元函数的形式,格式如下:
#include <iostream.h> class Counter { unsigned int value; public: Counter( ) { value=0; } //constructor void operator ++( ); //operator overloading void operator--( ); // function unsigned int operator( )( ); // decleration }; void Counter::operator++( ) { if(value<65535) value++; //"++"是重载符吗? 是重载符吗? }
//i++中的"++"是重载运算符吗? 中的" 是重载运算符吗? 中的 是重载运算符吗
mycounter++; cout<<"\n mycounter="<<mycounter( );
}
mycounter--; mycounter--; cout<<"\n mycounter="<<mycounter(); }
其中,第一操作数为this 指针指向的对象C1(重载函数的调用 其中,第一操作数为 指针指向的对象 重载函数的调用 者),第二操作数为 . ,第二操作数为C2. 同理,表达式 被编译器解释为: 同理,表达式C1-C2被编译器解释为: 被编译器解释为
C1.opቤተ መጻሕፍቲ ባይዱrator-(C2);
综上可见: 综上可见:对运算符的重载为成员函数形式时可采用隐式和显 式两种方式调用. 式两种方式调用.
§4.2 运算符重载的语法形式
在C++中,运算符重载是通过运算符重载函数实现的,运 中 运算符重载是通过运算符重载函数实现的, 算符重载函数一般采用下述两种形式之一. 算符重载函数一般采用下述两种形式之一. 成员函数的形式; 成员函数的形式; 友元函数的形式. 友元函数的形式.
1,运算符重载的成员函数形式 ,
string x,y;
那么, 实现两个串的合并. 那么,可以使用函数strcat(x,y)实现两个串的合并. 如果在表示字符串的类对象x, 的特定环境下,运算符" 使 如果在表示字符串的类对象 ,y 的特定环境下,运算符"+"使 用于类对象,能被解释为串对象x 的合并, 用于类对象,能被解释为串对象 和y 的合并,则编程就更方便 了.
一元运算符 隐式调用: 隐式调用:@objx 或者objx@ 显示调用: 显示调用:objx.operator@( ) 二元运算符 隐式调用: 隐式调用:objx1@objx2 显示调用: 显示调用:objx1.operator@(objx2)
2. 运算符重载为友元函数
友元函数
<返回值类型> operater<运算符>(形参列表) 例:复数加 Complex operater+(const Complex &x, const Complex &y)const
例如:下面程序定义了一个类名为 的计算器, 例如:下面程序定义了一个类名为Counter 的计算器,初始化 三个运算符, 为0,为计算器重载了"++","--","( )"三个运算符,分别 ,为计算器重载了" , , 三个运算符 实现计数器加1, 和取值的操作. 实现计数器加 ,减1和取值的操作. 和取值的操作
§4.1 重载运算符
在基本数据类型上,系统提供了许多预定义的运算符. 在基本数据类型上,系统提供了许多预定义的运算符. 例如: 例如:
int x,y; y=x+y;
对基本类型,这些运算符的操作具有特定的含义. 对基本类型,这些运算符的操作具有特定的含义. 如果string 类的两个对象 和y串要合并,以构成一个新字符串, 类的两个对象x 串要合并, 如果 串要合并 以构成一个新字符串, 即:
第4章 目 录 章
§4.1 重载运算符 §4.2 运算符重载的语法形式 §4.3 其它运算符的重载举例
第4章 运算符重载 章 运算符重载(Operator Overloading)
重载运算符是C++ 的一个重要特性,使用运算符重载, 的一个重要特性,使用运算符重载, 重载运算符是 程序员可以把C++ 运算符的定义扩展到运算分量是对象的情 程序员可以把 况. 运算符重载的目的是使C++ 代码更直观,更易读. 代码更直观,更易读. 运算符重载的目的是使 由简单的运算符构成的表达式常常比函数调用更简洁, 由简单的运算符构成的表达式常常比函数调用更简洁, 易懂. 易懂. 本章重点介绍如何定义和使用与类有关的运算符. 本章重点介绍如何定义和使用与类有关的运算符.
结果: 结果: C1+C2=5-1i C1-C2=-1+1i
注意:程序中出现的表达式C1+C2中的运算符"+"的操作数是 注意:程序中出现的表达式 中的运算符" 的操作数是 中的运算符 两个复数对象,是重载的加法运算符.编译器解释为: 两个复数对象,是重载的加法运算符.编译器解释为:
C1.operator+(C2);
它是一种特殊的成员函数,其语法形式为: 它是一种特殊的成员函数,其语法形式为:
type X::operator@(参数表) (参数表 参数表)
{ //相对于该类而定义的操作 运算符重载函数体 相对于该类而定义的操作(运算符重载函数体 相对于该类而定义的操作 运算符重载函数体) }
其中, 为函数的返回类型; 其中,type 为函数的返回类型; @是泛指要重载的运算符号; 是泛指要重载的运算符号; 是泛指要重载的运算符号 X是重载该运算符的类的类名; 是重载该运算符的类的类名; 是重载该运算符的类的类名
结果: 结果:
mycounter=1; mycounter=2; …… mycounter=12; mycounter=10;
注意:程序中重载运算符"++","--"和"( )"使用的操作数为 注意:程序中重载运算符" , 和 使用的操作数为 类对象;预定义运算符" 使用的操作符为基本类型. 类对象;预定义运算符"++","--"使用的操作符为基本类型. , 使用的操作符为基本类型
例如:下边是运算符重载的另一个例子,程序实现了复数的加 例如:下边是运算符重载的另一个例子, 和减运算. 和减运算.
#include <iostream.h> class Complex { public: Complex() { real=imag=0.0; } Complex(double r) { real=r; imag=0.0; } Complex(double r,double i) { real=r; imag=i; } Complex operator+(const Complex& c); Complex operator-(const Complex& c); friend void print(const Complex& c); private: double real,imag; };
}
void print(const Complex& c)
{
if(c.imag<0) cout<<c.real<<c.imag<<"i"; else cout<<c.real<<"+"<<c.imag<<"i";
}
void main() { Complex C1(2.0),C2(3.0,-1.0),C3; C3=C1+C2; cout<<"\n C1+C2="; print(C3); C3=C1-C2; cout<<"\n C1-C2="; print(C3); }
相关文档
最新文档