浅谈C++中的对象指针和对象引用

本文通过实例详细讲解了C++中指向类数据成员的指针、指向类成员函数的指针及对象指针的应用。同时探讨了对象指针作为函数参数时的行为差异,并介绍了对象引用作为函数参数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;

/**
1\指向类数据成员的指针
2\指向类成员函数的指针
3\一个对象指针
****************/
class A
{
public:
int fun (int b) { return a*c+b; }
A(int i) { a=i; }
public:
int c;
private:
int a;
};

int main()
{
//int A:: *pc = &A::c;
A x(8); //定义类A的一个对象x

int A::*pc; //定义一个指向类数据成员的指针pc
pc=&A::c;//给指针pc赋值
x.*pc=3; //用指针方式给类成员c赋值为3
cout<<"member virable value:"<<x.c<<endl;

int (A::*pfun)(int); //定义一个指向类成员函数的指针pfun
pfun=&A::fun; //给指针pfun赋值
A *p=&x; //定义一个对象指针p,并赋初值为x
cout<<"invoking value"<<(p->*pfun)(5)<<endl; //用对象指针调用指向类成员函数指针pfun指向的函数

p->c=90;
cout<<"p->c=90;"<<p->c<<endl;
//(x.*pfun)(5)
return 0;
}

/**
4\对象指针作函数的参数
****************/

class M1
{
public:
M1() { x=y=0; }
M1(int i, int j) { x=i; y=j; }
void copy(M1 *m);
void setxy(int i, int j) { x=i; y=j; }
void print() { cout<<x<<","<<y<<endl; }
private:
int x, y;
};

void M1::copy(M1 *m)
{
x=m->x;
y=m->y;
}

void fun(M1 m1, M1 *m2);

void fun(M1 m1, M1 *m2)
{
m1.setxy(12, 15);
m2->setxy(22,25);
}
void main()
{
M1 p(5, 7), q;
q.copy(&p);

fun(p, &q); //注:这和java是不同的,java传对像,形参变实参也会变的,C++是不一样的

p.print();
q.print();
}
/*result:
5,7
22,25

从输出结果可以看出,当在被调用函数fun中,
改变了对象的数据成员值[m1.setxy(12, 15)]
和指向对象指针的数据成员值[m2->setxy(22, 25)]以后,
可以看到只有指向对象指针作参数所指向的对象被改变了,
而另一个对象作参数,形参对象值改变了,可实参对象值并没有改变。
因此输出上述结果。*/



/**
5\对象引用作函数参数
****************/
class M
{
public:
M() { x=y=0; }
M(int i, int j) { x=i; y=j; }
void copy(M &m);
void setxy(int i, int j) { x=i; y=j; }
void print() {cout<<x<<","<<y<<endl; }
private:
int x, y;
};

void M::copy(M &m)
{
x=m.x;
x=m.y;
}

void fun(M m1, M &m2);

void main()
{
M p(5, 7), q;
q.copy(p);
fun(p, q);
p.print();
q.print();
}

void fun(M m1, M &m2)
{
m1.setxy(12, 15);
m2.setxy(22, 25);
}

void main()
{
M p(5, 7), q;
q.copy(p);
fun(p, q);
p.print();
q.print();
}

/*result:
5,7
22,25
*/

//this指针

 class A
{
public:
A() { a=b=0; }
A(int i, int j) { a=i; b=j; }
void copy(A &aa); //对象引用作函数参数
void print() {cout<<a<<","<<b<<endl; }
private:
int a, b;
};

void A::copy(A &aa)
{
if (this == &aa) return; //这个this是操作该成员函数的对象的地址,在这里是对象a1的地址
*this = aa; //*this是操作该成员函数的对象,在这里是对象a1。
//此语句是对象aa赋给a1,也就是aa具有的数据成员的值赋给a1的数据成员
}

void main()
{
A a1, a2(3, 4);
a1.copy(a2);
a1.print();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值