值传递(pass-by-value)引用传递(pass-by-reference)以及函数与const关系

Posted fan-0802-whu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值传递(pass-by-value)引用传递(pass-by-reference)以及函数与const关系相关的知识,希望对你有一定的参考价值。

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);

以上是关于值传递(pass-by-value)引用传递(pass-by-reference)以及函数与const关系的主要内容,如果未能解决你的问题,请参考以下文章

Java 是“按引用传递”还是“按值传递”?

Java 是“按引用传递”还是“按值传递”?

Java 是“按引用传递”还是“按值传递”?

Java,按值传递,引用变量

如果指针值作为引用传递,该值的生存期是多久? [复制]

按值传递-树未删除[重复]