函数的返回值为指针类型的时候

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uagvdu/article/details/77075524

非常量引用的初始值必须为左值

一。 C++实例

************************************************
    B show()
    {
        B c;
        cout <<"show " << endl;

        return   c;
    }
*************************************************
    void test()
    {
        B a;

        a.show();
        cout <<" test "<<endl;
    }
*************************************************
以C++的某个自定义类为例:

当show返回值是自定义类型后,调用该函数,会自动调用一次拷贝构造函数生成一个临时变量,即返回值
是一个临时变量

二。 C实例

*************************************************
     typedef struct big_thing
      {
          char buf[128];
      }big_thing;
*************************************************
      big_thing return_test()
      {
          big_thing b;
          b.buf[] = 0;
         return b;
      }

     int main()
     {
       big_thing n = return_test();
     }
*************************************************
出自《程序员的自我修养-链接、装载与库》P299
eax是函数传递返回值的一个通道。
1.对于小于4个字节的数据函数将返回值存储在eax中。
2.5~8个字节对象的情况调用惯例都是采用eax和edx的联合返回方式进行。
3.大于8个字节的返回类型,用上面代码测试:

以C语言的一段代码为例:

1.首先main函数在栈额外开辟了一片空间,并将这块空间的一部分作为传递返回值的临时对象,这里称为temp
2.将temp对象的地址作为隐藏参数传递个return_test函数
3.return_test 函数将数据拷贝给temp对象,并将temp对象的地址用eax传出。
4.return_test返回以后,mian函数将eax 指向的temp对象的内容拷贝给n。
简单就是一句话:当返回值非引用的时候,只要有函数返回值,那么该返回值就是一个临时变量

三:临时变量能不能被引用:

class A;
A func();
const A &ref=func();

这种情况下,ref 会一直有效到ref消失
函数是值返回,创建了一个临时变量

 A &ref=func();
 若没有加const,该引用也不能成立 

解释:
    : 临时的中间变量都是const,所有没有const的引用会失败。

四: 最后说一下我出现的问题:

*************************************************
    const  Node* GetRoot()
    {
        return _root;
    }

*************************************************
没问题:
    void test(BinaryTree T1, BinaryTree T2)
    {
         const Node*  const&  root1 = T1.GetRoot();
         const Node*  const&  root2 = T2.GetRoot();
    }
*************************************************
有问题:
    void test(BinaryTree T1, BinaryTree T2)
    {
         const Node*&  root1 = T1.GetRoot();
         const Node*&  root2 = T2.GetRoot();
    }

非常量引用的初始值必须为左值: 

左值,右值:

左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存
在的临时对象。一个区分左值与右值的便捷方法是:看能不能对表达式取地址,如果能,则为左值,否则为右值。

解释:

两个对比一下,你会发现,有问题的仅仅少了个const

1. 联想前面的例子:返回一个普通变量和返回一个指针变量,都是对这个变量的一份临时拷贝进行返回。
2. 函数的返回值虽然是一个指针,但是返回的这个指针本身就是一个原指
针的一份拷贝,是一个临时变量,具有常属性
3. 当你写一个函数返回值为任意类型的指针的时候,取函数的返回值地址(不能先定义变量 = 函数
,再给变量取地址,应该直接对所调用的函数取地址),你会发现,取地址错误,也是因为临时变量。
4.返回类型是内置类型的时候,函数不能直接取地址,而若是自定义类型的话,函数就可以直接取地址,与编译器处理有关

参考文章:http://www.cnblogs.com/bugershang/archive/2013/08/18/3265729.html
http://zonglinli86.blog.163.com/blog/static/2077521822013017101115821/

猜你喜欢

转载自blog.csdn.net/uagvdu/article/details/77075524
今日推荐