看书上的代码范例,一般涉及到类或结构的时候,进行函数的参数传递都是使用&然后突然想到,如果不使用&进行参数传递,那么程序在遇到需要进行深拷贝的类时,到底是进行深拷贝还是浅拷贝呢?比如类A里面包含通过指针p生成的数组。然后在函数调用A的时候,对数组内成员进行操作那么原先的A里是否会同时发生变化呢?

解决方案 »

  1.   

    &表示传递的是应用(或者地址)
    VC++中没有“深拷贝”这类的东西(拷贝构造除外),要么传地址,要么传值
      

  2.   

    我的意思是,如果传值的话那么被传递者内部的动态内存会是怎样传递举个例子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是否也会被改动?
      

  3.   

    好吧我刚才还是实际测试下代码,发一下两次测试的数值和结果
    先是代码
    #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();
    }  
    第一次测试:删除拷贝构造函数运行结果:第二次测试恢复拷贝构造函数运行结果看来在没有提供自定义的深拷贝构造函数的情况下通过值传递的参数依然导致了原来的类变量内部数据被篡改但是在有深拷贝构造函数的情况下,原来的内部数据就保存完好
      

  4.   

    我知道一般来说设计到类变量的函数,都要使用&来进行引用传递我只是很好奇如果不是用&进行参数传递的话,到底会发生什么事情,以及为什么会发生这些事情……
      

  5.   

    fun(int &a)

         a=5;
    }int a=3;fun(&a);a结果应该是5,而传值的话,函数外的a的结果还是3