就像你说的那样.
按值传递对象时,将调用其复制构造函数以生成将在函数内使用的此类对象的新实例.对这种新对象所做的更改不会反映到原始对象1中.
与结构一样,默认的复制构造函数只执行原始对象的浅拷贝 – 即,将其字段复制2到新实例;在许多情况下,这是不可取的(例如,如果对象包装指针/另一个资源),那么有些类重新定义复制构造函数或完全禁用它.这些最后一个类的对象只能通过指针或引用传递.
如果值大于指针(大小),或者通常如果它们的复制构造函数不“便宜”,那么按值传递对象可能是昂贵的.另一方面,与指针相比,pass-by-value产生了通常的优点,即不必指定指针所有权,让被调用者对对象做任何想做的事情等.
请注意,按值传递对象会导致多态性丧失.这是因为按值接收对象的函数接收具有精确大小和类型的静态类型对象,因此任何传递派生类对象的尝试都将导致对象切片(调用基类的复制构造函数,默认情况下,只复制基类中可用的字段.
这就是为什么传递对象的首选方法通常是const引用的原因.这产生了几个优点:
>不涉及副本;被调用者将看到的对象将是呼叫时指定的对象;
>由于const限定符,无法对原始对象进行任何更改;
>但是如果被调用者需要更改对象的副本,它仍然可以从引用中自行构造副本;
>没有笨拙的指针语法;
>保留多态,因为在幕后我们实际上传递了一个指针;
>对对象所有权没有太大的疑问:关于引用的一般规则是它们由调用者拥有.
>就物体的“原始场”而言;当然,如果原始对象和副本继续共享指向同一资源的指针/句柄,则对一个的一些修改可能会影响另一个.>按位复制原始类型(和一般POD),而为非POD类型调用复制构造函数.