C++ 引用变量

来源:互联网 发布:淘宝搜索关键词看福利 编辑:程序博客网 时间:2024/05/22 13:02

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


0 0
原创粉丝点击