您的位置:首页 > 编程语言 > C语言/C++

C++ 引用变量

2014-05-05 10:12 232 查看

转载自: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的地址
引用和指针区别很明显这里不累述了。呵呵。
引用函数的参数不能是表达式(以前的编译器可能用临时变量,现在的一般都是报错不允许用)
如:swapr(a+3,b);//不允许,a+3 不符合要求
应尽可能使用const:
如swapr(const int & a,const int & b);
优点:
1.使用const可以避免无意中修改数据的编程错误
2.使用const是函数可以处理const和非const参数,否则只能接受非const
3.使用const引用可以使函数正确的生成并使用临时变量
#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)引用,结构两者都可以
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: