指针是C/C++的强大工具,但也是最容易出错的地方。
C++在函数调用时支持三种方式:赋值传递,引用传递,指针传递。
1.赋值传递是在函数调用栈内创建临时对象,并将实参对象复制到临时对象,函数内部只能操作实参对象的副本。这种方式对于基本类型倒无所谓,但是对于庞大的类对象,则会带来很大的调用代价。
2.引用传递是通过实参对象的别名来引用实参对象,并不将实参对象进行拷贝,函数内部可以直接操作实参对象,因此它的优点是高效,适合传递大型对象,同时这种方式也可以用作从函数返回数据的方式,它的缺点就是实参对象要在函数调用之前就必须存在。
3.指针传递本质上也是赋值传递,指针变量的大小固定,因此也比较适合传递大型对象,当然也可以用作从函数中返回数据。同时,初学者容易犯的错误来了,比如想要用以下函数获取对象指针:
1 void getMethod(Method* p_method) 2 { 3 p_method = new Method(); 4 }
但是函数只是操作了实参对象的副本,我们真正想改变的实参对象并未修改,因此真正的方法是:
1 void getMethod(Method** pp_method) 2 { 3 *pp_method = new Method(); 4 }