小白问题:有关类的参数传递 看书上的代码范例,一般涉及到类或结构的时候,进行函数的参数传递都是使用&然后突然想到,如果不使用&进行参数传递,那么程序在遇到需要进行深拷贝的类时,到底是进行深拷贝还是浅拷贝呢?比如类A里面包含通过指针p生成的数组。然后在函数调用A的时候,对数组内成员进行操作那么原先的A里是否会同时发生变化呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 &表示传递的是应用(或者地址)VC++中没有“深拷贝”这类的东西(拷贝构造除外),要么传地址,要么传值 我的意思是,如果传值的话那么被传递者内部的动态内存会是怎样传递举个例子class A{//...int *p}A::A(){//...p=new int[MAX];}然后在函数调用的时候fun(A a1){//...for(int i=0;i<MAX;i++){a1.p[i]=i;}}当a1被改动之后,调用函数点的instance是否也会被改动? 好吧我刚才还是实际测试下代码,发一下两次测试的数值和结果先是代码#include <iostream>typedef unsigned int UINT;using namespace std;class A{ public: A(void); A(UINT); A(const A&); //Deep copy ~A(void); void Show(void); UINT Len(void); UINT *p; private: UINT i;};void foo1(A);A::A(){ p=NULL; i=0;}A::A(UINT r){ p=new UINT[r]; for(int j=0;j<r;j++) { p[j]=0; } i=r;}A::A(const A& R){ i=R.i; if(i!=0) { p=new UINT[i]; for(UINT j=0;j<i;j++) { p[j]=R.p[j]; } } else { p=NULL; }}A::~A(){ if(NULL!=p) { delete[] p; system("pause"); }}void A::Show(){ for(UINT j=0;j<i;j++) { cout<<p[j]<<endl; }}UINT A::Len(){ return i;}int main(){ A a(10); a.Show(); foo1(a); a.Show(); return 0;}void foo1(A a1){ for(UINT i=0;i<a1.Len();i++) { a1.p[i]=i; } a1.Show();} 第一次测试:删除拷贝构造函数运行结果:第二次测试恢复拷贝构造函数运行结果看来在没有提供自定义的深拷贝构造函数的情况下通过值传递的参数依然导致了原来的类变量内部数据被篡改但是在有深拷贝构造函数的情况下,原来的内部数据就保存完好 我知道一般来说设计到类变量的函数,都要使用&来进行引用传递我只是很好奇如果不是用&进行参数传递的话,到底会发生什么事情,以及为什么会发生这些事情…… fun(int &a){ a=5;}int a=3;fun(&a);a结果应该是5,而传值的话,函数外的a的结果还是3 接分~~~~~~~~~ 如何生成的EXE都能用不需要那些dll而且小一点 怎样才能在打印的时候不分页打印呢 如何识别两幅图像的差异之处 哪位高手有用hook recv函数截获ip包的源代码啊?(100分)相送!!! 发现一个编译错误 'Debug/IRManage.pch' is not a valid precompiled header file 怎样在程序里实现多个异源表(处于不同数据库服务器中的表)的连接? 知道内存地址怎么用指针指到内存地址 !!高手指点 如何在文件信息里自定义记号? 请教vc画图 问题 directshow 摄像头采集图像叠加背景 窗口的查找??
VC++中没有“深拷贝”这类的东西(拷贝构造除外),要么传地址,要么传值
{
//...
int *p
}A::A()
{
//...
p=new int[MAX];
}
然后在函数调用的时候fun(A a1)
{
//...
for(int i=0;i<MAX;i++)
{
a1.p[i]=i;
}
}当a1被改动之后,调用函数点的instance是否也会被改动?
先是代码
#include <iostream>typedef unsigned int UINT;using namespace std;class A
{
public:
A(void);
A(UINT);
A(const A&); //Deep copy
~A(void);
void Show(void);
UINT Len(void);
UINT *p;
private:
UINT i;
};void foo1(A);A::A()
{
p=NULL;
i=0;
}A::A(UINT r)
{
p=new UINT[r];
for(int j=0;j<r;j++)
{
p[j]=0;
}
i=r;
}A::A(const A& R)
{
i=R.i;
if(i!=0)
{
p=new UINT[i];
for(UINT j=0;j<i;j++)
{
p[j]=R.p[j];
}
}
else
{
p=NULL;
}
}A::~A()
{
if(NULL!=p)
{
delete[] p;
system("pause");
}
}void A::Show()
{
for(UINT j=0;j<i;j++)
{
cout<<p[j]<<endl;
}
}UINT A::Len()
{
return i;
}int main()
{
A a(10);
a.Show();
foo1(a);
a.Show();
return 0;
}void foo1(A a1)
{
for(UINT i=0;i<a1.Len();i++)
{
a1.p[i]=i;
}
a1.Show();
}
第一次测试:删除拷贝构造函数运行结果:第二次测试恢复拷贝构造函数运行结果看来在没有提供自定义的深拷贝构造函数的情况下通过值传递的参数依然导致了原来的类变量内部数据被篡改但是在有深拷贝构造函数的情况下,原来的内部数据就保存完好
{
a=5;
}int a=3;fun(&a);a结果应该是5,而传值的话,函数外的a的结果还是3