总结
1.参数 加了& 就是传引用,否则传值
2.返回值 只有返回外部作用域对象时传引用,否则传值
3.赋值运算 传值拷贝,且为【浅拷贝】
传值的深拷贝和浅拷贝问题:
浅拷贝就是拷贝后对象的指针成员指向同一个地址
深拷贝就是拷贝后对象的指针成员指向不同地址,但是指向内容相同
深拷贝的使用方式
0.首先要保证类实现了【自定义拷贝构造函数】
1.apple b=a;
2.apple b(a);
3.作为函数参数传递且不加&时
注意区别:b=a;和apple b=a; 【b=a只是浅拷贝传值】
class apple {
public :
int * data;
apple(){
data=NULL;
}
apple (const apple & t){
data=new int;
*data=(*t.data);
}
};
C++参数传递方式
1.基本类型
传值void func(int a){a=1;}
如需要传引用要指定void func(int & a){a=1;}
2.类类型
传值
class apple{
public :
int x=1;
int y=2;
};
void func(apple a){
a.x=10;
}
int main(){
apple ap;
cout<<ap.x<<endl;//1
func(ap);
cout<<ap.x;//1
return 0;
}
容器同理:
void func_v(vector<int> t){
t.push_back(2);
}
int main(){
vector<int> t;
t.push_back(1);
cout<<t.size()<<endl;//1
func_v(t);
cout<<t.size();//1
return 0;
}
如需要传引用要指定
class apple{
public :
int x=1;
int y=2;
};
void func(apple & a){
a.x=10;
}
int main(){
apple ap;
cout<<ap.x;//1
func(ap);
cout<<ap.x;//10
return 0;
}
容器同理:
void func_v(vector<int> & t){
t.push_back(2);
}
int main(){
vector<int> t;
t.push_back(1);
cout<<t.size()<<endl;//1
func_v(t);
cout<<t.size();//2
return 0;
}
C++返回值传递方式
1.基本类型
传值int rep(){ return ppp; }
如需要传引用需要指定int & rep(){ return ppp; }
2.类类型
传引用
vector<int> rev(){
return t;
}
对于函数内部变量则传值
vector<int> rev(){
vector<int > t;
return t;
}