C++ 引用变量

转载自: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)引用,结构两者都可以


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值