我们知道,在c++中参数传递,除数组以外,都是默认进行的值传递,比如:
Person oldP;
Person newP=oldP;
在JAVA中,引用传递,如果我们修改了newP,则oldP也同时发生变化;而在c++中却不是,c++中。上述表达式隐式的调用了Person类的默认拷贝构造函数,进行了值拷贝,从而产生了一个克隆的Person对象;
此时JAVA中执行:
newP==oldP //true;
在c++中执行:
newP==oldP //false;
在c++中,只要是将同类型的一个对象传递给另一个对象,均是如此;比如:
Person test(Person p){
.........
}
int main(){
Person p;
test(p);
}
同样的产生了一份拷贝;
Person oldP=test(P);
也是如此;
我们可以在Person类定义中重写;
Person::Person(const Person &p){
cout << "copy construtor";
........
}
此时我们能够看见消息的打印;
如何保证c++中的引用传递呢;
1)指针,传递指针
Person test(Person *p);
但是这样会给程序带来一定的负责性;
2)引用传递
Person test(Person &p);
传递的实参不会调用拷贝构造函数,而是直接传递了对象本身;
同时,也可以返回引用类型;
Person& test(Person &p){
.......
return p;
}
Person &pNew=test(p);
这个时候的复制依然不会调用拷贝构造函数;而:
Person pNew=test(p);
则会调用拷贝构造函数;
Person test(Person &p){
.......
return p;
}
而Person &pNew=test(p);则会报错,因为return p到 =test(P);过程中间,程序调用了默认拷贝函数,生成了一个test函数局部域的临时Person对象,她在test结果的时候销毁了,而引用类型的变量时必须得初始化为一个已经定义并且有效的对象的;
所以调用失败了;