目录
//引用调用(实现两个变量的交换)
拓:引用(&)变量
函数返回两个及以上的值(通过引用 / 指针 / 全局变量实现)
独立(常)引用
//返回引用
不要返回局部变量引用!!!(虽然编译可以通过)
引用变量概念
拓:实参和形参
//引用调用(实现两个变量的交换)
1.用值调用的方式(无法实现,函数无法更改a,b所在地址的值)
#include
using namespace std;
void swap(int a,int b);
int main(){
int a=1,b=2;
cout<<"a:"<
2.用指针方式
#include
void swap(int *a,int *b);
using namespace std;
int main(){
int a=1,b=2;
cout<<"a:"<
3.用引用调用方式实现
#include
using namespace std;
void swap(int &a,int &b);
int main(){
int a=1,b=2;
cout<<"a:"<
拓:引用(&)变量
//引用(&)变量
#include
using namespace std;
int main(){
int j=0,k=10;
int &i=j; //变量i成为变量j的别名
cout<<"i:"<
函数返回两个及以上的值(通过引用 / 指针 / 全局变量实现)
引用 调用
#include
using namespace std;
void extremum(const int a[],int n,int &max,int &min);
int main(){
int max,min;
int a[]={12,34,56,7,3,99,67,45,3,80};
extremum(a,sizeof(a)/sizeof(a[0]),max,min);
cout<<"max="<=0&&i
不要返回局部变量引用!!!(虽然编译可以通过)
#include
int &func();
using namespace std;
int main() {
cout<<(func()=5)<
引用变量概念
/*
1.引用变量定义时必须进行初始化。
在程序中对引用的存取都是对它所引用的变量的存取。
也不能再指向别的变量!
2.引用与指针不同:
指针的内容或值是某一变量的内存单元地址,
而引用则与初始化它的变量具有相同的内存单元地址。
3.返回引用必须保证返回的引用变量有合法的内存空间,并且不在函数的运行栈中。
一般只能返回全局变量和静态变量。
4.使用const常引用的目的就是提高性能(不需要制作数据的副本)。
使用引用参数而不加const就应该认为该参数将被修改!
5.当函数需要返回多于1个值,或希望修改实参的值时必须使用引用调用。
6.如果条件允许,就应将引用形参声明为const形参,
这样可以避免无意间修改数据而导致编程错误,
此外使用const形参使得函数能够接受const和非const实参,否则只能处理非const数据。
eg.
#include
void func(const int &i);
using namespace std;
int main(){
int a=1314;
func(a);
return 0;
}
void func(const int &i){
cout<
7.对比总结:
void func1(int n){
//可以修改n,但值不会返回调用者
} //可用值或变量调用
void func2(int &n){
//可以修改n,值会返回调用者
} //只能用同类型的变量调用该函数
void func3(const int &n){
//根本就不允许修改n
} //可用值或变量调用
//func1/2/3具体如下
#include
int func1(int n);
using namespace std;
int main(){
cout<<"4!="<0;n--){
fac*=n;
}
return fac;
} //可以修改n,但值不会返回调用者
#include
int func2(int &n);
using namespace std;
int main(){
//cout<<"4!="<0;n--){
fac*=n;
}
return fac;
} //可修改n,修改后的值会返回调用者
#include
int func3(const int &n);
using namespace std;
int main(){
cout<<"4!="<0;i--){ //func2的n和main的n的(实参地址传递给形参)地址当然也一致!
fac*=i;
}
return fac;
} //根本就不允许修改n
拓:实参和形参
/*
1、值传递
实参是变量,表达式等值。
find(int x){}
y= find(z);
上面的例子中,z是实参,x是形参。
x变z不变。
在值传递过程中,实参和形参位于内存中两个不同地址中,
实参先自己复制一次拷贝,再把拷贝复制给形参。
所以,在值传递过程中,形参的变化不会对实参有任何的影响。
2、地址传递(也称引用传递)
实参是指针。
在函数调用的时候,实参传递给你的是指针地址,地址一样也就意味着实参和形参是一样的,
当你的形参发生改变时,实参也会发生改变。
find(int &x){}
y= find(z);
上面的例子中,z是实参,x是形参。
z随x而改变。
3、const引用传递
find(const int &x){}
y= find(z);
上面的例子中,z是实参,x是形参。
z不随x而改变。
(const引用和值传递不一样)在值传递中要进行两次拷贝,浪费内存资源是相当可耻的,
const的出现有效避免了这种情况的出现,只需拷贝一次就够了。
*/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)