转载自:http://blog.csdn.net/ztk881012/article/details/17627785
引用的定义:
引用是定义已定义的变量的别名(另一个名称)。
引用一般用途:
引用变量的主要用途是用作函数的形参,通过将引用变量做参数,函数将使用原始数据,而不是拷贝。
创建引用变量:
int i;
int & j = i; 此处& 符号不是地址符 是用来类型标识符的一部分,就像声明中的int*指向int的指针,int& 是指向int的引用。
以上代码等价于 int* const j= i;不同之处在于必须在声明引用时将其初始化,而不是像指针一样,先声明再赋值。可以通过初始化声明来设置引用但是不能通过赋值来设置。
int a = 101;
int *pt = &a;
int &r = *pt;
int b = 50;
pt = &b;
将r初始化为*pt使得r指向a,接下来将pt改为指向b,并不能改变r是引用的是a;
用途
#include <iostream>
void swapr(int &a,int &b);//按引用传递
void swapp(int* a,int* b);//按指针传递
void swapv(int a,int b);//按值传递
using namespace std;
int main(){
int a = 100;
int b = 300;
cout<<"调用函数之前:a = "<<a<<" b = "<<b<<endl;
swapr(a,b);
cout<<"调用引用:a = "<<a<<" b = "<<b<<endl;
swapp(&a,&b);
cout<<"调用指针:a = "<<a<<" b = "<<b<<endl;
swapv(a,b);
cout<<"调用按值:a = "<<a<<" b = "<<b<<endl;
system("pause");
return 0;
}
void swapp(int* a,int* b){
int temp =*a;
*a =*b;
*b =temp;
}
void swapr(int &a,int &b){
int temp = a;
a = b;
b= temp;
}
void swapv(int a,int b){
int temp = a;
a = b;
b= temp;
}
按引用和按值调用相同不同点1:声明不同2.按值传递参数是复制a,b的值,引用是a,b的别名直接操作a,b的地址
#include <iostream>
#include <string>
using namespace std;
string version1(const string& s1,const string& s2);
const string& version2(string& s1,const string& s2);
const string& version3(string& s1,const string& s2);
int main(){
string input;
string cpy;
string result;
cout<<"请输入:"<<endl;
getline(cin , input);
cpy = input;
cout<<"字符串:"<<input<<endl;
cout<<"version1"<<endl ;
result = version1(input,"**");
cout<<"result = "<<result<<endl;
cout<<"input = "<<input<<endl ;
cout<<"version2"<<endl ;
result = version2(input,"##");
cout<<"result = "<<result<<endl;
cout<<"input = "<<input<<endl ;
input = cpy;
cout<<"version3"<<endl ;
//result = version3(input,"@@");//不能调用
cout<<"result = "<<result<<endl;
cout<<"input = "<<input<<endl ;
system("pause");
return 0;
}
string version1(const string& s1,const string& s2){
string temp;
temp = s2+s1+s2;
return temp;//返回一个string字符串 temp的内容将被复制到一个临时返回存储单元中。然后在main中复制给result。
}
const string& version2(string& s1,const string& s2){
s1 = s2+s1+s2;
return s1;//直接修改s1的值,可以
}
const string& version3(string& s1,const string& s2){
string temp;
temp = s2+s1+s2;
return temp;//虽然temp既不是指针也不是引用但是返回值是 引用因此函数运行结束之后 temp释放(程序试图引用已经释放的内存)
}
引用,指针和按值传递该什么时候使用?
(1)使用引用参数的主要情况:
a.程序员能够修改调用函数中的数据对象;
b.通过传递引用而不是整个数据对象,可以提高程序的运行速度。
(2)对于使用传递的值而不做修改的函数:
a.数据对象很小,如内置数据类型或小型结构,则按值传递;
b.数据对象是数据,使用const 指针;
c.数据对象是较大的结构,使用const指针或const引用;
d.数据对象是类对象,使用const引用。
(3)对于修改调用函数中数据的函数:
a.数据对象是内置数据类型,使用指针;
b.数据对象是数组,使用指针;
c.数据对象是结构,使用指针或引用
d.数据对象是类对象,使用引用。
速记:内置类型常规处理,数组用(const)指针,类对象用(const)引用,结构两者都可以