不是一定要用引用。
由于对象一般都含有较多的数据成员,当其作为函数参数传递时,传递对象值的耗时要比传递对象地址耗时多,所以一般采用传递地址的方式。
使用指针也能传递地址,但C++引入了引用的概念之后,使用引用要比使用指针的可读性好些。
有时,一些函数(包括拷贝构造函数)参数要求用(不是必须用)常引用,目的是为了避免函数体中无意地修改指针所指对象的值。
如果参数是类对象,就是值传递,就要复制,复制就要调拷贝构造函数。这就形成了拷贝构造函数再调拷贝构造函数,无限递归下去。因此只能用引用的方法
如果用传值的方式的话会带来拷贝的开销
函数参数有直接变量(如int、char、double等)类型、指针类型和引用类型。
如果参数是变量,传递方式是传值,就是将实参的值复制(复制,意味着空间消耗和时间消耗)到“栈”空间中。
如果参数是指针,传递方式是传址,需将指针复制(同样也消耗空间和时间,对于数组而言,只需存储数组首地址)到“栈”空间中。
如果是引用,则既不是传值,也不是传址,主调函数和被调函数共享参数的存放地址,与全局变量共享方式相同。
对于拷贝(复制)构造函数而言,类对象通常需要较多的存储空间,如果按值传递,必然会较大消耗“栈”空间,也需要较多的时间实施复制过程。因为复制构造函数不会修改参数的内容,也不会修改参数的属性,所以构造函数的参数应该是常量引用传递,如
ClassName(const ClassName &obj)