对象指针
1.对象指针变量
和基本类型变量一样,对象在初始化之后也会在内存中占有若干字节的内存空间。因此在程序中,我们可以通过对象名或对象的地址来访问该对象。对象指针变量就是一个用于保存对象在内存中存储空间首地址的指针变量,它与普通数据类型的指针变量有相同的性质。
声明对象指针变量的语法格式为:
类名 *对象指针名;
例如,声明exam类的对象指针obp;
exam *obp;
对象指针声明后,需要先赋值(使它指向一个对象)后使用。取得一个对象在内存中首地址的方法与取得一个变量在内存中首地址的方法一样,都是通过取地址运算符"&";例如:
exam ob;
exam *obp;
*obp = &ob;
最后的赋值表达式表示表达式&
取对象ob在内存中的首地址并赋值给指针变量obp,指针变量obp指向ob在内存中的首地址。
对象指针变量赋值后,我们就可以通过该指针来访问它所指向的对象的成员。使用对象指针访问对象成员的语法形式为:
对象指针名->成员名;
对象数组的每个元素都是一个对象,都有地址,我们也可以使用对象指针指向对象数组的元素。使用方式和上面所述指向对象的指针变量类似。
case 1:用对象指针引用单个对象成员
#include <iostream>
using namespace std;
class A{
private:
int x;
public:
void set_x(int a){
x = a;
}
void show_x(){
cout<<x<<endl;
}
};
int main(void)
{
A *ptr,ptr1;
ptr1.set_x(2);
ptr1.show_x();
ptr = &ptr1;
ptr->show_x();
return 0;
}
运行结果如下:
case 2:用对象指针引用对象数组
#include <iostream>
using namespace std;
class A{
private:
int x;
public:
void set_x(int a){
x = a;
}
void show_x(){
cout<<x<<endl;
}
};
int main(void)
{
A *ptr,ptr1[2];
ptr1[0].set_x(12);
ptr1[1].set_x(22);
ptr = ptr1;
ptr->show_x();
ptr++;
ptr->show_x();
return 0;
}
运行结果如下:
2.this指针
this指针是系统自动生成的,隐含于每个对象中的指针。
当一个对象生成后,系统就为这个对象定义了一个this指针,它指向这个对象的地址。
也就是说,每一个成员函数都有一个this指针,当对象调用成员函数时,该成员函数的this指针便指向这个对象。
这样,当不同的对象调用同一个成员函数时,编译器将根据该成员函数的this指针指向的对象确定引用那个对象的成员函数。成员函数访问类中数据成员的形式为:
> this->成员变量
主要应用场景: 成员函数中需要把对象本身作为参数传递给另一个函数的时候
case 3:this指针作用的例子
#include <iostream>
using namespace std;
class sample{
private:
int n;
public:
sample(int m){
n = m;
}
void add(int m){
sample q(0);
q.n = n+m;
*this = q;
}
void disp(){
cout<<"n = "<<n<<endl;
}
}
int main(void)
{
sample p(10);
p.disp();
p.add(10);
p.disp();
return 0;
}
运行结果如下: