C++的三种参数传递方式
2019-04-03 本文已影响0人
YocnZhao
作为一个java开蒙的程序狗,深刻感受到C++的万恶。
二话不说,代码开题。
testParam.cpp
void testMyParam1(std::vector<int> vectors) {
vectors.push_back(11);
}
void testMyParam2(std::vector<int> *vectors) {
vectors->push_back(11);
}
void testMyParam3(std::vector<int> &vectors) {
vectors.push_back(11);
}
main.cpp
#include <iostream>
#include <vector>
#include "testParam.h"
int main() {
std::vector<int> myVector;
myVector.clear();
testMyParam1(myVector);
std::cout << myVector.size() << std::endl;
myVector.clear();
testMyParam2(&myVector);
std::cout << myVector.size() << std::endl;
myVector.clear();
testMyParam3(myVector);
std::cout << myVector.size() << std::endl;
return 0;
}
运行结果如下:
运行结果
C++有三种参数传递方式
- 值传递
- 指针传递
- 引用传递
分别对应了上面的testMyParam1,testMyParam2,testMyParam3方法。
1、值传递:形参是实参的拷贝,改变函数形参的值并不会影响外部实参的值,这是最常用的一种传参方法,也是最简单的一种传参方法,只需要传递参数,返回值那是return考虑的;
2、指针传递:指针传递参数从本质上来说也是值传递,它传递的是一个地址。[值传递过程中,被调函数的形参作为被调函数的局部变量来处理,即在函数内的栈中开辟内存空间以存放由主调函数放进来的实参的值,从而成了实参的一个副本(记住这个,函数内参数的是实参的副本)]。由于指针传递的是外部实参的地址,当被调函数的形参值发生改变时,自然外部实参值也发生改变。
3、引用传递:被调函数的形参虽然也作为局部变量在栈中开辟了内存空间,但是栈中存放的是由主调函数放进的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中实参变量(实参和形参通过引用,合二为一,说白点就是:一个人,有两个名字那种)。因此,形参的任何改动都会直接影响到实参。
作为Java开蒙的程序员,我们知道Java里面其实只有两种传递:
- 值传递
- 引用传递
因为Java里面并没有指针的概念所以也就没有所谓的指针传递,但明显Java里面的两种传递方式跟C++的还是不同的。
Java的基本类型(其实包括String,数组等)是值传递,对象都是引用传递。而C++中的值传递或者引用传递则没有这个限制。