operator
在c++中有重载的意思。所谓重载,就是替换操作符原有的方法。为了理解重载,我们先看一下通常情况的class。
通常情况
class test{
public:
int i;
};
创建一个class test类型变量,然后进行操作。
int main(){
test t1 = test();
t1.i = 10;
NSLog(@"%d", t1.i);
return 0;
}
/// 10
如果是一个test指针类型,则需要先解引用再取成员变量值,如下:
test *tp1 = &t1;
NSLog(@"%d", (*tp1).i);
/// 10
或者使用->
代替解引用操作,如下:
NSLog(@"%d", tp1->i);
/// 10
但是不能直接调用t1->i
,编译会失败。这时可以通过运算符重载,使t1->
具有意义。
重载运算符
运算符重载的基本格式如下
返回值类型 operator 运算符名称 (行参列表) {
// TODO:
}
添加代码使->
具有意义:
class test{
public:
int i;
public:
test* operator -> () {
return this;
}
};
int main(){
test t1 = test();
t1.i = 10;
NSLog(@"%d", t1.i);
NSLog(@"%d", t1->i);
test* tp1 = &t1;
NSLog(@"%d", tp1->i);
return 0;
}
/// 10
/// 10
/// 10
简单理解
我对c++并不了解,只是个人理解,欢迎指正
XX operator x
可以简单理解成替换。这里的XX
表示类型,x
表示运算符。例如上文中的t->
可以替换成{括号内}->
。(这里括号内是this,他会替换成自身的指针)我们使用一个新的例子进行理解:
void* p = NULL; // 创建一个全部变量p
class otest{
public:
int i;
public:
otest* operator -> (){
return (otest*)p; // 返回p
}
};
int main(){
// 对p进行赋值
otest g = otest();
g.i = 999;
p = &g;
otest t1 = otest();
t1.i = 10;
NSLog(@"%d", t1->i); // 这里的->已经被重载
return 0;
}
/// 999
t1->
被替换成了p->
,最终输出的是999。上面的例子也可以写成这样:
class otest{ // 声明class
public:
int i;
public:
otest* operator -> ();
};
otest p = otest(); // 全局变量p
otest* otest::operator->(){ // 函数实现返回p的地址
return &p;
}
int main(){
// 赋值i
p.i = 999;
otest t1 = otest();
t1.i = 10;
NSLog(@"%d", t1->i);
return 0;
}
/// 999