一、C++ 按指针传值时,遇到的问题,记录如下:
当我们使用指针传参的时候,会从实参拷贝一份对象到形参,二者是不同的指针,但是指向同一块地址。
如果在被调用函数中对参数指针进行重新指向,则不会影响到调用函数中的实参。
但是修改了指针指向的地址的内容,则会影响,如下面代码中的a->x
#include<iostream>
class A
{
public:
int x=0;
};
void test(A* a)
{
a->x=10; //修改x的值,x到了函数之外也会变成10
std::cout<< &a<<std::endl;//0x16fdff608 可以看到指针本身的地址不同,说明是两个指针
a=0;//让a的值设为0,即a指向0
std::cout<< a<<std::endl; // 0x0
};
int main()
{
A *a =new A;
std::cout<<&a<<std::endl;//0x16fdff640
std::cout<<a<<std::endl; //0x1002061f0
test(a);
std::cout<<a<<std::endl; //0x1002061f0 函数内对指针重新指向,不影响实参指针
return 0;
}
可见,指针传值也存在复制的情况,虽然是指针,复制的开销可以忽略不计,且性能比值传参要好很多,但是依然容易出错
所以C++在此基础上引入了引用传值。
二、按引用传值时则不存在这种情况,引用传值不会出现复制的情况