zoukankan      html  css  js  c++  java
  • 返回引用

    一直很难理解返回引用:返回哪个对象的引用?返回的引用如何使用?

    一、返回值

    1. 示例:

    int func(parameter_list) 
    {
    	return a;   	
    }
    

    2. 解读:此函数返回变量 a 的值时,要产生一个临时变量保存 a 的值,又因为临时变量的生命周期是短暂的,所以该函数的返回结果不能作为左值。

    3. 运用:返回值的函数只能作为右值使用,且看下面:

    int i = func();		//正确,func()返回的值作为右值使用 
    func() = 3;			//错误,func()返回的值不能作为左值 
    int &r = func();	//错误,func()返回的值只是短暂存在的

    二、返回类型是引用类型

    1. 示例:

    int& func(parameter_list) 
    {
    	return a;   	
    }
    

    2. 解读:函数返回变量 a 的引用(即 a 的别名),不产生值的副本,此时只要变量 a 不是局部对象(而是静态局部对象或全局对象),就可以将返回值作为左值。

    3. 运用:

    //返回值:一个静态/全局对象 
    func() = 3;			//正确,func()的返回值能返回能作为左值
    int i = func();		//正确,func()的返回值能作为右值使用  
    int &r = func();	//正确,func()的返回值可以被引用 
    

    4. 返回局部对象的引用:当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。

    三、加深理解

    1. 返回形参的引用

    const string& shorterString(const string &s1, const string &s2)
    {
    	return s1.size() < s2.size() ? s1 : s2;
    }
    

    解读:由于形参和返回类型都是引用类型,所以在调用该函数以及函数返回结果(返回s1或s2)时,都没有复制这些 string 对象。简单的说,返回的引用是函数的参数s1或s2,而s1和s2同样也是引用(并不是在函数体内产生的,即不是局部对象)。

    2. 返回类对象的引用

    string& string::operator =(const string &str) 
    { 
        return *this;    //this指向调用该成员函数的对象
    }
    

    解读:上面是string类的赋值函数(属于类的成员函数)中,返回的类对象不能是函数内定义的类对象(会释放掉),一般为this指向的对象。

    佐证:之所以返回类对象的引用,因为想将返回值作为左值使用,如使用ss = s1 = s2(ss = s1返回左值后继续进行赋值)。

    3. 引用返回左值

    char& get_val(string &ss, string::size_type index)
    {
    	return ss[index];
    }
    
    //使用语句调用:
    	string s("123456");
        get_val(s,0)='a';	//作为左值 
        cout << s << endl;

    四、回答问题

    1. 返回哪个对象的引用

    由函数体内的代码可知,返回的是变量 a、变量 s1等,于是又联想到不能返回局部对象的引用,我们可以知道,我们在调用点处使用的就是这些返回的变量a、s1等,只不过可能是它们的别名罢了。

    2. 如何使用返回的引用

    这么用:函数名(实参) + 其他部分

    	func() = 3;			//作为左值,等号右边可以是合法的任意类型 
    	func()[2] = 3;		//返回数组的引用 
    	cout << func() << endl;	//直接输出值 
    	cout << func()[2] << endl; //同上
    

      

  • 相关阅读:
    未来所有的公司,都将成为互联网公司
    万达数字化管理体系
    架构图都画啥
    历经60年,数据库的王者终于出现了
    从智慧社区产品入手,阐述ToG产品的一些设计要点
    黑科技感爆棚的可视化大屏
    数据库编程——Oracle环境配置
    IO系列测试源码
    IO异步,读写压缩文件,监控文件系统
    StreamReader & StreamWriter
  • 原文地址:https://www.cnblogs.com/xzxl/p/7668094.html
Copyright © 2011-2022 走看看