您的位置:首页 > 编程语言 > C语言/C++

C++操作符函数

2016-06-10 22:33 246 查看
操作符函数语法:

返回类型 operator操作符(参数列表)

操作符可以+  -  *  %  /等运算符,这些操作符作为类操作符使用时仍然遵守它们被用作普通操作符时的优先级规则。

返回类型可以是对象,也可以是一般类型。

操作符函数可以定义为类的成员函数也可以定义为全局函数。作为成员函数和全局函数的意义是不一样的。

1.如果操作符函数声明为成员函数,调用该函数的对象将成为左操作数。当操作符函数为成员函数时,像类其他函数一样可直接访问类的私有成员(类.变量或指针->变量)

2.如果把操作符函数声明为全局函数,每个操作数将对应于该函数的一个输入参数。当操作符函数声明为全局函数时,类的私有成员变量无法被直接访问(类.变量或指针->变量),要么通过类公有函数访问,要么将全局操作符函数声明为该类的友元函数。

所谓类的友元函数是一种特殊的函数,是全局函数,但能访问该类的私有成员。

eg1:详解操作符函数为类成员函数

class point{

public:
int x;
private:
int y;
public:
point(int x,int y){this->x=x;this->y=y;}
point(){x=0;y=0;}
int getX();
int getY();
point operator+(point n);  //声明类的操作符函数

};

//在类外定义

point point::operator+(point n){
return point(this->x+n.x,this->y+n.y);//y虽然为private成员,可以通过n.y直接访问(操作符函数为类的成员函数)

}

int main(){
point p1(8,4);
point p2(2,3);
point p=p1+p2;
cout<<p.getX()<<" "<<p.getY()<<endl;

}

结果: 10 7

point p=n+pp;编译器将这条语句解释为使用左操作数(p1)调用本身的operator+函数。将右操作数(p2)作为函数的输入参数(p1.operator+(p2)),最后构造出另一个对象 point(this->x+n.x,this->y+n.y),返回,赋给p(这里调用副本构造器)。

在类操作符函数中,左操作数必须是一个类,其调用本身的操作符函数,把右操作数作为参数传入。对于point1+point2+point3这种情况不能将point1看成调用自身的operator+函数,point2,point3作为参数传入,这种理解方法是错误的。point1+point2+poin3这种情况可以理解为(poin1+point2)得到的对象再加point3即((point1+point2)+point3)操作符函数不变,即可得到结果。

eg2:详解操作符函数作为全局函数

1.

class point{

public:
int x;
private:
int y;
public:
point(int x,int y){this->x=x;this->y=y;}
point(){x=0;y=0;}
int getX();
int getY();
};

point operator+(point n1,point n2){
return point(n1x+n2.x,n1y+n2.y);//y为private成员,不能在通过n.y直接访问(操作符函数为全局函数)

}

int main(){
point p1(8,4);
point p2(2,3);
point p=p1+p2;
cout<<p.getX()<<" "<<p.getY()<<endl;

}

错误,由于全局函数没有权限访问类私有成员,无法编译通过。另外要说明的是对于全局操作符函数,操作符函数至少要有两个参数,分别为左操作数和右操作数。但可惜y是私有成员,所以此方法无法得到point p对象。
由于类的友元函数可以访问该类的私有成员,于是将全局函数作为友元函数,改进如下:

e3:

class point{
public:
int x;
private:
int y;
public:
point(int x,int y){this->x=x;this->y=y;}
point(){x=0;y=0;}
int getX();
int getY();
friend point operator+(point n1,point n2);  //声明为友元函数

};

//定义全局函数

point operator+(point p1,point p2){

return point(p1.x+p2.x,p1.y+p2.y);

}

int main(){
point p1(8,4);
point p2(2,3);
point p=p1+p2;
cout<<p.getX()<<" "<<p.getY()<<endl;

}

结果:10 7

p+p2中p1是操作符全局函数的第一个参数,p2是第二个参数。

对于3个point相加,给操作符函数多加一个参数,相应定义等都依次对应后依然是错误的。看来,也只能用于2个对象的相加。

有时候,操作符函数必须为全局函数。在成员函数里,左操作数被函数解释为“这个对象”,如果左操作数不是某种对象类型,就必须用全局函数。例如:3+point2,当然你也可以理解为point2+3作为成员函数编写,将int 作为操作符函数参数也可以。

操作符参数可以是对象也可以是其他类型。在成员操作符函数中返回类型也可以是左操作数对象也可以是其他对象,全局操作符函数中返回类型可以是某个参数类型也可以是其他类型(理由:A类中可以返回B类类型,由A类可以得到B类)不要过分纠结这些东西,懂得大方向即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: