值传递和参数传递的有关问题,召唤大神大牛。苦恼了一个下午

值传递和参数传递的问题,召唤大神大牛。。。苦恼了一个下午
#include <vector>
#include <iostream>
using namespace std;
void print (vector<int>& vn, int n) {
cout << "size()=" << vn.size () << endl;
cout << "capacity()=" << vn.capacity()<<endl;
for (int i = 0; i < n; i++)
cout << vn[i] << ' ';
cout << endl;
}
class A {
public:
A (void) {
cout << "A无参:" << this << endl;
}
A (const A& a) {
cout << "A拷贝:"<<&a<<" -> "<<this<< endl;
}
~A (void) {
cout << "A析构:" << this << endl;
}
};
int main (void) {
vector<int> vn (3);
print (vn, 3);
vn.push_back (100);
print (vn, 4);
vn.push_back (200);
print (vn, 5);
vn.push_back (300);
print (vn, 6);
vn.push_back (400);
print (vn, 7);
vn.resize (3);
print (vn, 3);
vn.push_back (500);
print (vn, 4);
vn.resize (7);
print (vn, 7);
vn.resize (13);
print (vn, 13);
vn.reserve (20);
print (vn, 20);
vn.reserve (14);
print (vn, 20);
vn.resize (1);
print (vn, 20);
vn.clear ();
print (vn, 20);
vector<A> va;
A a;
cout << "### 1 ###" << endl;
va.push_back (a);
cout << "### 2 ###" << endl;
va.push_back (a);
cout << "### 3 ###" << endl;
va.resize (1);
cout << "### 4 ###" << endl;
va.pop_back ();
cout << "### 5 ###" << endl;
va.reserve (3);
cout << "### 6 ###" << endl;
return 0;
}

  在print这个函数里面:void print (vector<int>& vn, int n),要求传递的参数vn是一个引用,但是为什么在主函数里面:print (vn, 4);这里vn作为一个对象而不是引用也可以传过去? 这里特不理解。 我问了别的同学,人家说,其实vn不是一个对象,而是一个对象的名字,所以作为引用是没问题的。 如果那样的话,我尝试把:void print (vector<int>& vn, int n),中的&去掉,变成:void print (vector<int> vn, int n);然后还是用print (vn, 4);还是可以的,这样的话,传递的就应该是“值” ,而不是引用了,但是既然上面说vn是一个引用,又怎么可以作为一个“值”作为参数传递给:void print (vector<int>vn, int n)这个函数呢? 今天下午对这个问题很不理解,麻烦大家告知我哪里理解出错了

------解决方案--------------------
print第一个参数是值传还是引用传递得看print的定义
------解决方案--------------------
你先将void print (vector<int>& vn, int n)这里的vn和你main函数里面的vn区分下吧。

将void print (vector<int>& , int )去掉参数名再讨论。
当你这里参数类型为引用的时候那么 你将vn传递过去 实际上这个引用只是作为你传递的vn对象的别名。

而如果你将这里的&去掉 改成值传递,这就意味着你传递的vn对象需要拷贝复制一份传递过去作为参数
------解决方案--------------------
函数传参,你可以显示的指示为引用,但是到底是否按照你这种做法来做,编译器已经做了优化。
即使你传递大的对象不是已引用的方式来传递(没有加&),编译器在需要的时候也是以引用的方式来操作的
------解决方案--------------------
void print (vector<int>& ref, int n)

print (vn, 3);
我给你改下你函数定义里面参数的名称吧。
就这里来说当你将vn传递过去之后就意味着ref这个引用 是vn的一个别名。