重载1

来源:互联网 发布:帝国cms二次开发 编辑:程序博客网 时间:2024/06/06 02:04

1.概念:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。就是函数的重载。

C++允许功能相近的函数在相同的作用域内以 相同的函数名,从而形成重载。

2.注意:函数的参数必须不同:个数不同或者类别不同。

[cpp] view plaincopy

<strong><spanstyle="font-size: 18px; ">int add (int x,int y); 

int add(float x,float y); 

 

int add(int x, int y); 

int add(int x, int y, int z); 

 

 

重载函数功能必须相同,下面程序会出现调用错误。

 int add (int x,int y){return x+y;} 

float add(float x,float y){returnx-y; }

[cpp] view plaincopy

 

 

具有默认形参值的函数的重载形式时,需要注意防止二义性。

 

void fun(intlength);</span></strong> 

 3.应用举例 

 using namespace std; 

 

int sumofsquare(int a,int b) 

  return a*a+b*b; 

 

double sumofsquare(double a,doubleb) 

 return a*a+b*b; 

 

int main() 

int m,n; 

cout<<"entern two integer:" 

cin>>m>>n; 

count<<"their sum ofsquare:"<<sumof square(m,n)<<end1; 

 

double x,y; 

cout<<"enter two realnumber:"; 

cin>>x>>y; 

count<<"their sum ofsquare:"<<sumofsqure(x,y)<<end1; 

 

retrun 0; 

}

二、运算符重载   

1.概念:运算符重载是对已有的运算符号赋予多重含义,使同一个运算符作用于不同类型的数据时的不同行为  

2.理解:运算符的重载的实质就是函数的重载,实现过程中将运算表达式转化为对运算函数的调用,将运算对象转化为运算符函数的实参。 

3.C++中预定义的运算符只能作用于基本的数据类型,对用户自定义的数据类型进行操作需要进行运算符重载。 

4.运算符重载的运算

(1)C++中所有的运算符中,存在少部分不能重载。不能重载的(类属关系 "." ,成员的指针运算符“.*”,作用域运算符“::”,三目运算符“?:”

(2)重载之后运算符的优先级和结合性都不变。

(3)运算符重载是针对新类型数据的实际需要,对原来的运算符做出相应的改变,一般来讲功能与原来相似,操作数的个数相同,并且至少有一个是自定义的类型。

5.运算符的重载形式有两种:重载为类的非静态成员函数和重载为非成员函数。 

两种重载的语法形式:

返回值类型operator 运算符(形参表)

 

函数体

 

返回值类型:重载运算符的返回值类型,运算结果类型。

定义运算符重载函数的关键字。

运算符:重载的元算符名称。

形参表:给出重载运算符中需要的参数和其类型。  

提示:当以非成员函数重载运算符时,有时需要访问运算符所涉及类的私有成员,这时可以把该函数声明为类的友元函数。

重载为类的成员函数时,函数的参数比原来的操作数少一个(第一个操作数被作为函数调用的目的对象,无需出现在参数表中,函数可以直接访问第一操作数的成员)

重载为类的非成员函数时,参数的个数和操作数的个数是相同的。

优点:改变现有运算符的操作方式,以用于类类型,使函数程序更加直观。 

5.运算符重载为成员函数

重载为成员函数,就可以自由的访问本类的数据成员,实际应用时是通过该类的的对象来访问重载的运算符。 

双目运算符:左操作数是对象本身的数据,有this指针指出。右操作数则需要通过运算符重载函数的参数表来传值。

单目运算符:操作数由对象this指针给出,就不再需要任何参数。  

理解:双目运算符B,要重载为类的成员函数,实现oprd1 B oprd2,其中oprd1为A类的对象,应该把B重载为A类的成员函数,该函数只有一个形参,形参的的类型是oprld所属的类型。经重载之后,表达式oprd1 B oprd2 就相当于函数调用 

单目运算符U,重载为类的成员函数,Uoprd ,其中oprd 为A类对象,则U 该重载为A类成员函数,函数没有形参。重载之后,U oprd 相当于 oprd.operatorU()。后置运算符“++”“--”,"oprd --""oprd++"重载后这个函数要带一个int 形参,用于区别前置和后置。

6.程序:复数类加减法运算重载为成员函数形式  

分析:是一个双目运算重载为成员函数的实例,把‘+’‘-’重载为复数类的成员函数,重载函数只有一个形参,类型是复数类对象。(MUL图)

#include<iostream> 

using namespace std  

class complex                                                             //复数类定义 

public:                                                                                                 //外部接口 

        complex (double r=0.0 ,double i=0.0):real(1),imag(i){}     //构造函数 

        complex operator +(const complex &c2) const;               //运算符+重载成员函数 

        complex operator -(const complex &c2) const;               //运算符-重载成员函数 

        void display() const;                                      //输出函数 

private:                                                            //私有成员 

        double real;                                              //复数实部 

        double imag;                                              //复数虚部 

};

complex complex ::operatop+(const complex&c2) const                //重载运算符函数实现 

  return complex (real+c2.real, imag+c2.imag);                     //创建一个临时无名对象作为返回值 

}

complex complex ::operator -(const complex&c2) const 

  return complex (real-c2.real,imag-c2.imag); 

void complex ::display () const 

  cont<<"("<<real<<",<<imag<<")"<<end1; 

} int main () 

 complex c1(5,4),c2(2,10),c3;                        //定义复数类的对象  cout<<"c1=";c1.display();   

 cout<<"c2=";c2.display(); 

 c3=c1-c2; 

 cout<<"c3=c1-c2";c3.display();                      //使用重载运算完成复数减法 

 c3=c1+c2; 

 cout<<"c3=c1+c2=";c3.display(); 

 return 0;  }