c++函数参数为对象和为对象的引用类型时,作用一样吗
ClassA,B;voidshow(Ap,B&q);这个函数调用时候,PQ的使用有什么不同吗...
Class A,B;
void show(A p,B &q);
这个函数调用时候,P Q的使用有什么不同吗 展开
void show(A p,B &q);
这个函数调用时候,P Q的使用有什么不同吗 展开
7个回答
展开全部
不一样,一个是复制传递,一个是引用传递。
复制传递时将对象复制一遍,在函数中的对象和原对象值相同,但是地址不同,函数中若修改对象的值,原对象不会受到影响,当函数执行完时,复制的对象会被销毁。
而引用传递不会复制,只是将原对象的地址传过去,类似指针。此时函数中的对象和原对象是一个东西,相同的地址,可能名字不一样而已。
一般传递对象时使用的是引用传递,效率更高。对象一般比较大,复制的话销毁的时间较多。如要防止函数修改参数,可以使用const 引用。
附个演示代码,你就知道了。
#include <iostream>
#include <conio.h>
using namespace std;
class A
{
public:
void set(int data)
{
this->data = data;
}
void show()
{
cout << data << endl;
}
private:
int data;
};
void change(A a,A &b)
{
a.set(3);
b.set(3);
}
int main()
{
A a,b;
a.set(1);
b.set(1);
cout << "befor change" << endl;
a.show();
b.show();
change(a,b);
cout << "after change" << endl;
a.show();
b.show();
getch();
return 0;
}
复制传递时将对象复制一遍,在函数中的对象和原对象值相同,但是地址不同,函数中若修改对象的值,原对象不会受到影响,当函数执行完时,复制的对象会被销毁。
而引用传递不会复制,只是将原对象的地址传过去,类似指针。此时函数中的对象和原对象是一个东西,相同的地址,可能名字不一样而已。
一般传递对象时使用的是引用传递,效率更高。对象一般比较大,复制的话销毁的时间较多。如要防止函数修改参数,可以使用const 引用。
附个演示代码,你就知道了。
#include <iostream>
#include <conio.h>
using namespace std;
class A
{
public:
void set(int data)
{
this->data = data;
}
void show()
{
cout << data << endl;
}
private:
int data;
};
void change(A a,A &b)
{
a.set(3);
b.set(3);
}
int main()
{
A a,b;
a.set(1);
b.set(1);
cout << "befor change" << endl;
a.show();
b.show();
change(a,b);
cout << "after change" << endl;
a.show();
b.show();
getch();
return 0;
}
展开全部
当然会不同啊,p的值只在改函数里面会有所变化,函数调用一结束,p又回到之前的值,没有任何的改变,出淤泥而不染;而q就不同了,被感染了,它的值会保存起来,函数调用结束了,它就不再是刚开始调用的那个值了,而是调用之后的新值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
作用当然是不一样的,前者是对源对象的赋值。
后者是对源对象的地址的赋值。
后者以指针的操作会影响到原来的对象,而前者不会。
后者是对源对象的地址的赋值。
后者以指针的操作会影响到原来的对象,而前者不会。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
传值相当于在函数内重新定义一个对象,把参数引用的对象赋值给这个新定义的对象。在函数内对对象的操作都是针对新定义的对象,函数退出后,新定义对象就不存在了。传址调用则没有定义新对象,函数内的操作就是对引用对象本身的操作。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这么讲吧
void fun(int x,int y)
{
int tempt;
tempt=x;
x=y;
y=tempt;
}
与
void fun(int &x,int &y)
{
int tempt;
tempt=x;
x=y;
y=tempt;
}
不同,上一个没有交换成功,下一个交换成功了的,引用就是用别名,还是对那个数操作,不知听懂了吗。
void fun(int x,int y)
{
int tempt;
tempt=x;
x=y;
y=tempt;
}
与
void fun(int &x,int &y)
{
int tempt;
tempt=x;
x=y;
y=tempt;
}
不同,上一个没有交换成功,下一个交换成功了的,引用就是用别名,还是对那个数操作,不知听懂了吗。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询