C++操作符函数
来源:互联网 发布:淘宝产品拍摄灯光设备 编辑:程序博客网 时间:2024/06/05 09:28
操作符函数语法:
返回类型 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;
}
由于类的友元函数可以访问该类的私有成员,于是将全局函数作为友元函数,改进如下:
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类)不要过分纠结这些东西,懂得大方向即可。
- 文件操作--C 函数操作
- c文件操作函数
- c文件操作函数
- C字符串操作函数
- C文件操作函数
- mysql c操作函数
- C字符串操作函数
- c文件操作函数
- C文件操作函数
- C字符串操作函数
- C文件操作函数
- C文件操作函数 .
- C文件操作函数
- c 文件操作函数
- c内存操作函数
- c 字符操作函数
- C文件操作函数
- C内存操作函数
- Android App卡顿慢优化之解决内存抖动及内存泄漏
- 打印空心菱形
- 逃不过的fork()
- BLE4.0 BLE4.1 和BLE4.2 的主要区别
- 阿里服务器CentOS安装docker错误解决
- C++操作符函数
- HDOJ1312 DFS
- nginx负载均衡简单配置
- android Cursor的自动管理方式
- OpenStack Liberty 高可用性概述和参考-第一部分
- 【FFMpeg视频开发与应用基础】七、 调用FFMpeg SDK实现视频水印
- 【Android】刮刮卡实例
- <Bundle>通过bundle进行Activity之间的数据传递
- 位运算的列子