在C++中,函数参数分为值传递,指针传递和引用传递。
6.1 值传递
值传递在函数调用时产生一个临时副本,函数中对传入参数的修改和操作是对副本的操作,不改变实参本身的值,所以无需const来保护。
值传递的保护很好,但值传递存在缺点,需要产生临时副本,如果传入的是对象,那么需要进行构造、复制、和析构等操作,效率不高。这时候可以考虑引用传递
void foo1(int x);
void foo2(ClassType instance); //开销较大
下面这种保护无意义:
void foo1(const int x);
void foo2(const ClassType instance);
6.2 引用传递
通过传入实参的引用,降低开销。因为引用即本身,不需要去产生一个临时副本。
void foo1(int &x);
void foo2(ClassType &ref);
对于上述两个函数,函数调用和值传递的形式完全一样,不同的是函数内部得到的x和ref是调用传入实参的引用。也正因为如此,引用可以通过函数改变传入的参数来改变实参。这对与实参来说,比较危险,这时候需要通过const修饰来保护传入的引用不被修改。
void foo1(const int &x);
void foo2(const ClassType &ref);
通常来说,对于基本内部类型,不存在对象的构造等操作,所以下面两种保护参数不被修改的方式效率基本一样。
void foo1(int x);
void foo1(const int &x);
6.3 指针传递
指针传递在保护参数不被修改上和引用传递是一样的,指针传递还有一个功能是可以扩大接收参数的范围:
void foo1(const ClassType *ptr);
结合上面const与指针,我们知道,ptr指向一个自认为是const类型的对象,所以!传入的对象不一定是const修饰的对象,可以是const对象,也可以非const对象。反过来,如果没有const修饰函数的形参,则只能传入非const对象。
需要明确,无论传入的是否是const对象,都无法通过指针来修改这个对象,这和上面指针与const的关系是一致的。
最后需要知道:const只能修饰一个输入参数,如果是输出参数,无论是引用传递还是指针传递,都不能使用const来修饰










