标签:c++参数传递
一般的变量声明时就创建相应的内存空间,该空间用于存储该变量的值。函数进行按值传递时,是将该变量值的拷贝传给函数,因此在函数中将传进来的值改变也不能改变变量的值。
指针变量和按指针传递。指针类型的变量在声明后,根据操作系统的不同创建相应大小的内存空间,该空间上存储的是一个地址,该地址指向一个变量。如果函数按指针进行传递参数,也是将变量的拷贝传进来,但该变量是一个指向某内存单元的地址,对该变量进行解引用操作,改变其内存单元存储的值,即可改变变量解引用后的值。
引用和按引用传递。引用是变量的别名。在声明引用时,不对该引用分配内存空间,只是一个指向变量的别名。对引用操作既是对变量操作,所以函数在按引用传递变量时,如果改变引用的值,既是改变变量的值。
Void fun1(int& nTemp);
Void fun2(const int& nTemp);
fun1(100);
fun2(100);
函数fun1的参数是int型的引用变量,需要指向一块内存空间,而100是常量,常量是不允许复制和修改的也不占用内存空间,所以这个函数调用是错的。(系统在传递参数是创建临时变量,而临时变量不能作为非const引用参数)
函数fun2的参数是const型的int引用变量,该变量在函数内部不能被修改,甚至不能有修改的风险,是只读的。而系统这是会产生一个int型的临时变量,临时变量可以传递const型的参数,所以该函数可正确调用。
(C++编译器的一个关于语法的限制,如果一个参数是以一个非const引用传入的,那么C++编译器就有理由相信我们传入的参数是可以在函数中修改的,并且这个修改的变量还是在函数外也是可以使用的,但是如果我们把一个临时变量当成非const引用参数传进来,则由于临时变量的特殊性,程序员是不能操作临时变量的,而且临时变量在使用完成后会释放,所以如果我们修改一个临时变量实际上没有意义的,所以C++编译器就加入了临时变量时不能作为非const引用的这个语意限制的,主要是限制这个非常规的用法的潜在错误。临时变量实际上是可以作为左值的,这点在Thinking in C++的第一卷中的7.3节是有介绍的。非const引用只能指向非const同类型的对象,但是const引用可以初始化为不同但相关的类型的对象或者初始化为右值。)
(临时变量:在C/C++中,其实从真正的意义上的临时变量是看不见的,就是说它们不会出现在你的代码中。临时变量并不是我们临时创建的变量,而是,由编译器在程序需要的时候自动生成的临时性变量,它们并不在代码中出现,但是它们又是确实存在的,而临时变量的生成时机通常是在函数参数传递时发生类型转换,以及函数返回值时被创建。)
Int* pPrint = new int;
Void fun3(int* pTemp){pTemp= new int(); }
Void fun4(int* &pTemp){pTemp = new int(); }
fun3(pPrint);
fun4(pPrint);
函数fun3获得实参pPrint的拷贝,该变量的内容是地址,而函数体又赋给一个新的地址,由于是实参的拷贝,所以不能改变实参的值,即pPrint的值不变。
函数fun4参数是int型指针的引用,是int指针本身,通过函数体改变该值,可以改变实参pPrint的值。
返回引用。如果函数返回的是局部变量,局部变量在函数结束后销毁,引用指向一个被销毁的内存空间是不允许的,所以返回局部变量的引用是错误的。
标签:c++参数传递
原文地址:http://wwhx27.blog.51cto.com/6807550/1631091