解释一段vc++程序

来源:百度知道 编辑:UC知道 时间:2024/05/15 19:44:13
#include<iostream.h>
class sample
{
public:
sample(){x=y=0;}
sample(int a,int b){x=a;y=b;}
void copy(sample &s){x=s.x;y=s.y;}//对象复制
void set(int a,int b){x=a;y=b;}
void print(){cout<<x<<' '<<y<<endl;}
private:
int x,y;
};
void func(sample s1,sample &s2)//
{
s1.set(11,22);
s2.set(33,44);
}
void main()
{
sample p(1,2),q;
q.copy(p);
func(p,q);
p.print();
q.print();
}
结果:
1 2
33 44
Press any key to continue

void func(sample s1,sample &s2)//
{
s1.set(11,22);
s2.set(33,44);
}
为什么s1能修改,s2不能

反了吧,是s2能修改,s1不能吧。
因为func的两个参数一个是传值,一个是引用。sample &s2这个是对象引用,效果相当于c里面的指针,传递进来的参数s2在这个函数里面进行了修改,在调用它的函数里检查它的值是变化了的。
func(p,q);
对应于s1,s2;
相当于s1 = p;s1是p的一个拷贝,所以你s1.set(11,22),更改的是s1的值,根本不会影响到p;这就是传值。
而引用不同,s2就是q,他们是一个东西,所以s2.set(33,44); 改的就是q的值。相当c里面常用的指针的传址效果

因为s2用的是引用,在函数中修改的一直都是s2的真实值。而s1因为是一个变量形式,在函数中会另外申请一个同类型的变量,也就是说在函数中修改的都是那个新申请的变量的值,s1压根没变化,只有引用或者指针才会修改函数变量的值

s1是值传递 ,改变的是匿名参数的值 .s2是引用传递 ,改变的是匿名参数的指针所指的值,这个指针所指的值与s2所在的地址空间相同