关于引用传参:
对于非内部数据类型的参数而言,像 void func(A a)
这样声明的函数注定效率比较低。因为函数体内将产生 A 类型的临时对象用于复制参数 a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为 void func(A &a)
,因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数 void func(A &a)
存在一个缺点:
“引用传递”有可能改变参数 a,这是我们不期望的。解决这个问题很容易,加const 修饰即可,因此函数最终成为 void func(const A &a)
。
以此类推,是否应将 void func(int x)
改写为 void func(const int &x)
,以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
小结:对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将 void func(A a)
改为 void func(const A &a)
。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如 void func(int x)
不应该改为 void func(const int &x)
。