C++中普通引用传参会发生的问题
C++中普通拷贝和引用作为函数参数时是有很大区别的,下面进行了相关的研究
下面的示例中,A为一个类,gg为一个形参为A&类型的函数。
参考代码
class A {
public :
int m;
int n;
int x;
int y;
public:
A():m(1),n(1),x(1),y(1){}
void foo(){cout<<"a"<<endl;}
~A(){m=0;cout<<"析构"<<endl;};
};
void gg(A& aa)
{
cout<<"xixi"<<endl;
}
A aa;
gg(aa);
cout<<aa.m<<endl;
运行结果
结果以及分析:
可以看到,上述的执行结果中只打印了一次"析构",且m值为1,那么我们可以得到一个结论,当某一个对象作为实参传给函数的形参且此时该形参为引用类型时,该引用变量离开函数作用域时是不会调用析构函数的。
总结和提升
引用相当于是给某一个变量起别名,那么当函数形参为引用类型时,某一个对象作为实参传入,当引用变量离开函数作用域时,此时该变量所对应的对象还是存在于外部作用域的,因此此时并不会调用析构函数。
若此时将引用改为普通变量(此例中为A类型)的话,此时函数结束时就会调用析构函数,因为此时传参的过程中会有一个拷贝的操作,相当于内存中会有两个对象。