精华内容
下载资源
问答
  • C++函数返回引用

    万次阅读 多人点赞 2016-12-08 13:31:23
    函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是几种引用情况:   1,引用函数...

    注:C++ 有三种传递方式:值传递,指针传递,引用传递

    返回“值”和返回“引用”是不同的

            函数返回时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是几种引用情况:

    一、千万不要返回局部对象的引用

          const string &mainip(const string &s)
          {
                 string ret=s;
                 return ret;
          }

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

            同理,指针也是这样,返回指针的时候,不能指向局部临时变量,否则指针将变为野指针;

    二、引用函数的参数,当然该参数也是一个引用

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

            以上函数的返回值是引用类型。无论返回s1或是s2,调用函数和返回结果时,都没有拷贝这些string对象。简单的说,返回的引用是函数的参数s1或s2,并且参数s1、s2也是引用,不是在函数体内产生的。函数体内局部对象是不能被引用的,因为函数调用完局部对象会被释放。

    三、返回 this 指向的对象

            在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为 this 指向的对象,典型的例子是 string类的赋值函数。

    [cpp]  view plain  copy
    1. String& String::operator =(const String &str)  //注意与“+”比较,函数为什么要用引用呢?a=b=c,可以做为左值  
    2. {  
    3.     if (this == &str)  
    4.     {  
    5.         return *this;    
    6.     }  
    7.     delete [] m_string;  
    8.     int len = strlen(str.m_string);  
    9.     m_string = new char[len+1];  
    10.     strcpy(m_string,str.m_string);  
    11.     return *this;  
    12. }  

    四、引用返回this 的成员变量,或者 引用参数的成员变量

            原标题为:引用返回左值(上例的=赋值也是如此,即a=b=c是可以的)

            原文这里表达不清晰,因为只要是引用,都可以作为左值使用。只因为下面的例子一般用在等号左边,当左值使用。
            可以定义一个和返回值一样的引用类型,来接受函数的返回值,操作此引用值,和直接操作函数的参数是一样的,引用都是使用引用传递;

          char &get_val(string &str,string::size_type ix)
          {
                 return str[ix];
          }
          使用语句调用:
           string s("123456");
           cout<<s<<endl;
           get_val(s,0)='a';
           cout<<s<<endl;

            这种情况,和第二种是一样的,只不过是返回了参数(引用类型)的一部分。也可以不作为左值,故修改如下:

    char &ch = get_val(s,0);
    ch = ‘A’;

     
    

            此句进行的都是引用传递,故运行之后,s[0] 就变为了 A,s为“A23456”;

            此外,可以返回引用参数的成员变量,亲测有效。似乎不是局部临时变量,只要函数结束之后内存没有被销毁的,作为引用返回都没问题:

    QString& Test(Student &stu)
    {
        return stu.m_name;
    }

    QString & Student::getRName()
    {
        return (*this).m_name;
    }

    五、最后转上一段code作为总结

    #include<iostream>
    using namespace std;
    string make_plural(size_t,const string&,const string&);
    const string &shorterString(const string &,const string &);
    const string &mainip(const string&);
    char &get_val(string &,string::size_type);
    int main(void)  
    {  
        cout<<make_plural(1,"dog","s")<<endl;  
        cout<<make_plural(2,"dog","s")<<endl;  
          
        string string1="1234";  
        string string2="abc";  
        cout<<shorterString(string1,string2)<<endl;  
          
        cout<<mainip("jiajia")<<endl;  
          
          
        string s("123456");  
        cout<<s<<endl;  
        get_val(s,0)='a';  
          
        cout<<s<<endl;  
          
        getchar();  
        return 0;  
    }  
    //返回非引用   
    string make_plural(size_t i,const string &word,const string &ending)  
    {  
        return (i==1)?word:word+ending;  
    }  
    //返回引用   
    const string &shorterString(const string &s1,const string &s2)  
    {  
        return s1.size()<s2.size()?s1:s2;  
    }  
    //禁止返回局部对象的引用(我的dev c++ 没有报错,比较可怕)   
    const string &mainip(const string &s)  
    {  
        string ret=s;  
        return ret;  
    }  
    //引用返回左值  
    char &get_val(string &str,string::size_type ix)  
    {  
        return str[ix];  
    }  


    展开全文
  • c++ 函数返回引用

    万次阅读 多人点赞 2010-07-17 15:15:00
    c++ 返回函数引用

    一,c++函数的返回分为以下几种情况

     

    1)主函数main的返回值:这里提及一点,返回0表示程序运行成功。

    2)返回非引用类型:函数的返回值用于初始化在跳用函数出创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样 的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。

    3)返回引用:当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。

     

     

    二,函数返回引用

     

    1,当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。先看两示例,示例1如下:

     

    const string &shorterString(const string &s1,const string &s2)

    {

    return s1.size < s2.size ? s1:s2;

    }

     

    示例2:

     

     

     

        形参和返回类型都是指向const string对象的引用,调用函数和返回结果时,都没有复制这些string对象。

     

    2,返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。比如:

     

    int& abc(int a, int b, int c, int& result){

      result = a + b + c;
        return result;
    }


         这种形式也可改写为:


    int& abc(int a, int b, int c, int *result){
      *result = a + b + c;
       return *result;
    }


         但是,如下的形式是不可以的:
    int& abc(int a, int b, int c){
       return a + b + c;
    }

     

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

    const string &manip(const string &s)

    {

    string ret =s;

    return ret;  //wrong:returning reference to a local object

    }

     

    4,引用返回左值。返回引用的函数返回一个左值。因此这样的函数可用于任何要求使用左值的地方。示例见:c++ primer p215

     

    5,由于返回值直接指向了一个生命期尚未结束的变量,因此,对于函数返回值(或者称为函数结果)本身的任何操作,都在实际上,是对那个变量的操作,这就是引入const类型的返回的意义。当使用了const关键字后,即意味着函数的返回值不能立即得到修改!如下代码,将无法编译通过,这就是因为返回值立即进行了++操作(相当于对变量z进行了++操作),而这对于该函数而言,是不允许的。如果去掉const,再行编译,则可以获得通过,并且打印形成z = 7的结果。

     

    include <iostream>
    include <cstdlib>
    const int& abc(int a, int b, int c, int& result){
      result = a + b + c;
       return result;
    }


    int main() {
       int a = 1; int b = 2; int c=3;
       int z;
      abc(a, b, c, z)++;  //wrong: returning a const reference
      cout << "z= " << z << endl;
      SYSTEM("PAUSE");
       return 0;
    }

     

    三,思考:

        

    1,什么时候返回引用是正确的?而什么时候返回const引用是正确的? 

     

        返回指向函数调用前就已经存在的对象的引用是正确的。当不希望返回的对象被修改时,返回const引用是正确的。


    展开全文
  • c++函数返回引用

    2015-07-14 17:28:08
    函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是几种引用情况:   1,引用...

    函数返回值和返回引用是不同的

    函数返回时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是几种引用情况:

     

    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,千万不要返回局部对象的引用


          const string &mainip(const string &s)
          {
                 string ret=s;
                 return ret;
          }
          
          当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。




    C++中函数返回引用

     (2012-07-29 22:21:45)
    标签: 

    局部变量

     

    引用类型

     

    返回

     

    内存地址

     

    值类型

    分类: C.Plus
    1)什么是引用?

    引用就是变量的别名,操作一个变量的引用也就相当于操作变量本身,这一点跟指针很类似。

    (2)C++函数为什么要使用引用?

    C语言之中大量利用指针作为形参或者函数返回值,这是由于值拷贝会有很大的消耗(比如传入传出一个大的结构体)。所以在C++之中使用引用作为函数参数和返回值的目的和使用指针是一样的。而且形式上更加直观,所以C++提倡使用引用。

    (3)C++返回引用?

    前面提到利用引用作为函数形参和返回值的好处。

    C++之中函数的返回分为以下几种情况:

    1)返回非引用类型:函数的返回值用于初始化在跳出函数时候创建的临时对象。用函数返回值来初始化临时对象与用实参初始化形参的方法是一样的。如果返回类型不是引用的话,在函数返回的地方,会将返回值复制给临时对象。且其返回值既可以是局部对象,也可以是表达式的结果。

    2)返回引用:当函数返回引用类型的时候,没有复制返回值,而是返回对象的引用(即对象本身)。

    函数返回引用:实际上是一个变量的内存地址,既然是内存地址的话,那么肯定可以读写该地址所对应的内存区域的值,即就是“左值”,可以出现在赋值语句的左边。

    《@》函数返回引用的时候,可以利用全局变量(作为函数返回),或者在函数的形参表中有引用或者指针(作为函数返回),这两者有一个共同点,就是返回执行完毕以后,变量依然存在,那么返回的引用才有意义。

    小结:

    (1)使用引用当作函数参数和返回值,效率更高。

    (2)函数返回的对象引用,必须在调用函数前就已经存在,不允许返回局部变量的引用!

    (3)当不希望返回的对象被修改的时候,可以添加const。


    #include <iostream>
    using namespace std;
    //一般数据类型测试
    //返回局部变量
    template <typename T1>
    T1 & funTestDataType(T1 b)
    {
        T1 a=b;
        T1 c;
        cout<<"函数内部声明的局部变量:"<<"&a="<<&a<<",a="<<a<<endl;
        return a;
    }
    int fun_a()
    {
        int a=0;
        int b=1;
        int c=2;
        int d=3;
        int e=4;
        return a;
    }
    int main()
    {
        //函数返回值类型为引用时.
        //一:系统预定义的基本数据类型的引用
        //1、返回函数内部声明的局部变量的引用,在调用函数的时候用引用接收.内存地址相同.值也相同,执行无错误(系统编译警告:warning C4172: returning address of local variable or temporary),返回了局部变量或者临时变量的地址.    这是因为该局部虽然被释放了内存,但该段内存没有被重新分配。(所以不可以返回局部变量的引用)
        int a=10;
        int &b=funTestDataType(a);
        //fun_a();
        cout<<"接收函数返回引用的引用:"<<"&b="<<&b<<",b="<<b<<endl;
        return 0;
    }

    总结

    1、引用其实本质就是地址
       2、当函数返回值类型为引用时,一般就用引用类型去接收,或者就使用了引用的作用,如果用非引用类型接受,就等于将函数返回的引用的数据值,复制给了该接收对象,和函数返回非引用类型是一样的效果。
    3、当函数返回值类型为引用时,如果不考虑接收问题,则有一个特性,则是可以直接操作该函数返回的引用,如放在=左面 +=等.
       4、错象:当在函数内部定义了局部变量(本质就是为一段内存取了一个名字,并占用),出了这个函数,这个局部变量不可再使用,也就是这个局部变量并不指向任何一个内存了,但是这个局部变量原来所指的内存如果没有被系统重新分配,里面的值仍然没有变,如果有一个引用指向该局部变量,在局部变量被释放内存以后,如果没有被系统重新将这段内存分配,那么其值仍可用。
    5、不可以将常引用当作函数返回值返回.

       6、用引用作函数参数和返回值类型的好处。直接是地址操作,不需要将值一一复制给形参,
       7、返回值不需要有临时变量的存在,也不需要调用任何构造函数。节省了开销

    8、一般当函数形参需要复杂类型的数据时,最好用引用,可以节省系统开销,

    9、能用常引用的地方尽量用常引用。

    10、如果非要返回一个局部变量的引用,可以new 类型(初值) 申请一个堆内存的临时变量,这样只要不delete释放,那么在程序退出之前内存就不会被释放,直到不再使用时便可delete掉.



    展开全文
  • 这几句代码貌似没有问题。实际上,在字面值字符串传入const string&amp;的时候发生了隐式转换,生成了一个string...如果指向局部变量,该引用必然是个无效的引用,因为函数返回时局部变量已经被释放;如果该引用...

    这几句代码貌似没有问题。实际上,在字面值字符串传入const string&的时候发生了隐式转换,生成了一个string的临时值。返回的是此临时值的引用。当代码执行到cout时,临时值已经被释放。所以name是一个未定义的值。

    函数返回引用是个危险的操作。如果该引用指向函数的参数,会出现上述问题;如果指向局部变量,该引用必然是个无效的引用,因为函数返回时局部变量已经被释放;如果该引用指向堆内存的变量,则无法释放,除非你想让它与进程共存亡。在万不得已的情况下可以指向类成员变量,不过要考虑要在其对象释放之前使用。

    不过函数返回引用还是有其用途的。第一,可以在拷贝赋值运算符中返回*this的引用,使得外界可以连续赋值,如a=b=c;第二,可以在单例模式下静态函数返回静态变量的引用。

    展开全文
  • c++函数返回引用,并赋值给引用对象

    千次阅读 2020-06-23 14:45:04
    函数返回引用时,返回值不需要另外申请临时对象,直接返回引用本身,大大节省了程序执行效率. 但是函数返回引用后,直接赋值给引用对象和非引用对象也是很重要的一点,直接看下面例子: #include <iostream> #...
  • ```c++ struct Person { const std::string & getName() ...在上面这段代码中,getName()函数的return类型是**string**,而函数返回类型定义为**string&**,(暂且忽略const),请问这两者能视作同一种类型吗?
  • (1)什么是引用引用就是变量的别名,操作一个...(2)C++函数为什么要使用引用? C语言之中大量利用指针作为形参或者函数返回值,这是由于拷贝会有很大的消耗(比如传入传出一个大的结构体)。所以在C++之中
  • int & function(),c++函数返回引用

    千次阅读 2017-07-22 18:56:10
    转载自http://blog.csdn.net/keyouan2008/article/details/5771844  根据自己的理解有删改 先看看该链接讨论的问题作为热身。...   函数返回值和返回引用是不同的 函数返回值时会产生
  • 函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生的副本。 T f(); 返回一般的类类型,返回的类类型不能作为左值,但返回的类类型可以直接调用成员函数来修改,如function().set_Value()...
  • 这样的对象可以把对象的引用或者指针存在栈中,随着函数的结束而销毁,而把创建的对象内容存在堆中。如果需要在堆上创建对象,要么使用new运算符,要么使用malloc系列函数。 而关键是理解好“自动存储”的概念[1]...
  • 本篇文章是对C++函数返回引用的注意事项进行了详细的分析介绍,需要的朋友参考下
  • C++函数返回引用类型 C++的函数无法返回局部变量的引用,即,要么返回全局变量的引用,要么返回指针指向内容的引用。 1.对于一般函数 1)尽量避免返回引用类型,多使用引用传参 vector<T> func(const vector...
  • C++函数返回引用

    千次阅读 2019-08-25 22:56:52
    1. 返回引用和不返回引用的区别 下面两个代码是在类中的成员函数,而m_data_变量为类的私有成员变量。 int& at() { return m_data_; } int at() { return m_data_; } 上面两个函数,第一个返回值是int的引用...
  • 讨论函数返回结果机制的运行效率和左值引用、右值引用的关系。
  • C++函数返回引用和返回值的区别

    千次阅读 2018-10-01 17:57:36
    1, C++函数返回引用和返回值的区别 2,C++函数的返回值——返回引用类型&amp;非引用类型
  • 函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生的副本,既然是引用,那引用谁呢? 引用一个局部变量 引用一个局部变量,是不可行的。 string& toString(const int& n) { ...
  • C++ 函数调用返回左值引用

    热门讨论 2020-11-20 14:28:08
    被调函数返回类型决定返回的是左值还是右值,当被调函数返回类型是引用时,返回的是左值,其余情况下返回的是右值,被调函数返回的左值有着与其他左值类型同样的运算特性,需要特别指出的是,我们能为返回类型是...
  • C++函数返回值和返回引用

    千次阅读 多人点赞 2018-10-26 15:09:57
    C++函数返回过程基本可以分为两个阶段,返回阶段和绑定阶段,根据两个阶段中需要返回的类型不同(返回值和引用),和要绑定的的类型(绑定引用)会产生不同的情况。 最基本的规则是先返回,再绑定,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 247,793
精华内容 99,117
关键字:

c++函数返回引用

c++ 订阅