1.pass-by-value的情况:
缺省情况C++以pass-by-value(继承C的方式)传递对象至(或来自)函数。函数参数都是以实际参数的复件为初值,调用端所获得的也是函数返回值的一个复件,复件由对象的拷贝构造函数产出,可能使pass-by-value成为耗时的操作。
2.耗时的原因
类的对象作为函数参数时,如果使用值传递,要先拷贝一份实参的副本,需要调用类的拷贝构造函数,函数结束时副本被销毁,需要调用析构函数。如果该类是派生类,调用的函数更多,流程更多更复杂。
拷贝构造函数
拷贝构造函数的调用:如果一个新对象被定义,一定会有一个构造函数被调用,如果没有新对象被定义,就不会有构造函数被调用。
3.pass-by-reference的优势
①pass-by-reference:没有任何构造函数或析构函数被调用,因为没有任何对象被新建。参数声明中加上const,防止传入的对象被修改。
②*避免slicing(对象切割)问题
值传递:子类对象被切割成父类对象,功能缺失
引用传递:解决该问题
4.pass-by-reference的底层本质
reference往往以指针的形式实现,传递的是指针
对象为内置类型(如int),STL的迭代器和函数对象,pass-by-value高效一些。
5.pass-by-reference的举例
class A{…};
void action(A a);//值传递pass-by-value
void action(const A& a);//引用传递pass-by-reference
6.函数与const
①函数后加const:const是对函数的一个限定,使其无法修改类内的数据成员。const告诉别人这个函数不会改变对象的状态。
声明一个函数用 const 关键字来说明这个函数是一个只读函数(read only method),即不会修改任何的数据成员也就是不会改变该对象的状态。该类函数的声明和定义时都要加上 const 关键字。
不能调用非const函数:如果我们在编写 const 函数时不小心修改了数据成员,或者调用了其他非 const 成员函数(即会修改数据成员的函数),编译器将会报错。这无疑让代码更加的健壮。
如 void action(A a) const;
②const修饰函数返回值
用const来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。归根究底就是使得函数调用表达式不能作为左值。
如 const A& action (A a);
③形式参数加const:防止传入的实参被改变。
如 void action(const A& a);
原文地址:https://www.cnblogs.com/fan-0802-WHU/p/10953721.html