归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝
人生就像骑单车,想保持平衡就得往前进!
一起加油!
目录
一、隐含的this指针:
二、this指针讲解:
三、说明:
四、注意:
五、共勉:
一、隐含的this指针:
#include<iostream>
#define PI 3.1415926
using namespace std;
class circle{
private:
int r;
public:
circle(int pr):r(pr){
}
double getarea();
};
double circle::getarea(){
return PI*r*r;
}
int main(){
circle cir1(5);
circle cir2(10);
circle cir3(15);
cout<<"半径为5的圆的面积为"<<cir1.getarea()<<endl;
cout<<"半径为10的圆的面积为"<<cir2.getarea()<<endl;
cout<<"半径为15的圆的面积为"<<cir3.getarea()<<endl;
return 0;
}
二、this指针讲解:
类的每个对象中都拥有数据成员的存储空间。上面的例题中定义了三个对象,因此有三个同样大小的空间存放三个对象的数据成员。但是,cir1、cir2 和 cir3 在调用函数 getarea()时都调用同一段函数代码段。
当不同对象的成员函数引用数据成员时,如何保证引用的是指定对象的数据成员呢?
对于cir1.getarea(),应该是引用对象 cir1 中的r,来计算圆 cir1的面积;而对于 cir2.getarea( )来说,则应该是引用对象 cir2 中r,来计算出圆 cir2 的面积。现在 ciri 和 cir2 调用的是同一个函数段,系统应该怎样使函数分别引用 cirl 和 cir2 中的数据成员?
通过 this 指针可以解决这个问题在每一个成员函数中都包含一个特殊的指针,称为 this 指针。它是指向本类对象的指针。this 指针是一个特殊的隐含指针,它隐含在每一个类的非静态成员函数中(包括构造函数和析构函数),即类的每个非静态成员函数都有一个 this 指针指向调用这个成员函数的对象。当一个对象调用成员函数时,编译系统先将对象的首地址赋给 this 指针,然后调用成员函数。在成员函数存取数据成员时,隐含地使用 this 指针,这样成员函数就能够通过 this 指针来访问目的对象的数据成员。
例如,当 cir1 调用成员函数 getarea 时,编译系统把对象 cirl 的起始地址赋给 this 指针。因此,在成员函数引用数据成员时,就按照 this 的指向找到对象 cirl 的数据成员。例如 getarea 数要计算 PI*r*r 的值,实际上是执行以下语句:
PI*this->r*this->r;
由于当前 this 指向 cir1,因此相当于执行以下语句:
PI*cir1.r*cir1.r;
这样就计算出圆 cir1 的面积。
同样地,如果 cir2 调用成员函数 getarea,编译系统就把对象 cir2 的起始地址赋给成员函这样就计算出圆 cir1 的面积。getarea 的 this 指针,计算出来的结果就是 cir2 的面积。this 指针是隐式使用的,它是作为参数被传递给成员函数的。
成员函数 getarea 的定义如下:
double circle::getarea(){
return PI*r*r;
}
C++编译后把它处理为:
double circle::getarea(circle *this){
return PI*this->r*this->r;
}
即在成员函数的形参表列中增加一个 this 指针。
在调用该成员函数时,实际上是用以下方式调用的:
cirl.getarea(&cir1);
将对象 cir1的地址传递给形参 this 指针。然后按 this 的指向去引用对象的成员。
三、说明:
上述的这些过程都是编译系统自动实现的,程序设计者不必人为地在形参中增加this 指针,也不必将对象a 的地址传给 this 指针。同时,在需要时也可以显式地使用 this指针。
例如,在 circle 类的 getarea 函数中,下面两种表示方法都是合法并且相互等价的。
return (PI * r *r); //隐含使用 this 指针
return (PI * this->r * this->r);//显式使用 this 指针
四、注意:
可以用*this 表示被调用的成员函数所在的对象,*this 就是 this 所指向的对象,即当前的对象上面的 return 语句也可写成:
return(PI*(*this).r * (*this).r);
*this 两侧的括号不能省略,不能写成*this.r
五、共勉:
以上就是我对类和对象——(6)友元的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对类和对象的理解,请持续关注我哦!!!