zoukankan      html  css  js  c++  java
  • 函数返回值为引用类型

    #include<iostream>
    #include<string>
    #include<fstream>
    using namespace std;
    ofstream out("test.out");
    class A
    {
            public:
            string id;
            A(string iid=""):id(iid){out<<"A(),iid="<<iid<<endl;}
            A(const A& a) {id=a.id+"copy";out<<"A(const A& a),iid="<<id<<endl;}
            A& operator=(const A& rv)
            {
                    id=rv.id;
                    return *this;
            }
            A f1(){return *this;}
            A& f2(){return *this;}
            A& f3(){A* pb=new A; return *pb;}
    
    };
    A& f()
    {
            A a("a");
            cout<<"in f():"<<&a<<endl;
            return a;
    }
    int main()
    {
            A a("a");
            cout<<"&a:"<<&a<<endl;
            cout<<"f1():"<<&(a.f1())<<endl;
            cout<<"f2():"<<&(a.f2())<<endl;
            A b=a.f2();
            cout<<"&b:"<<&b<<endl;
            cout<<"f3():"<<&(a.f3())<<endl;
            cout<<"in main f():"<<&(f())<<endl;
            return 0;
     }
    

      

    从输出可以看出:

    对象a的起始地址与函数f2()的返回值地址相同,f2()的返回为引用;

    对象b的地址与对象a的地址不同,两个对象在内存中占有独立的空间,利用返回的引用类型初始化b,而不是在内存中再生成一个a对象的副本,然后再初始化b;

    对象a的起始地址与函数f1()的返回值地址不相同,f1()的返回不是引用,在内存中生成了一个对象a的副本;

    函数f()返回局部对象的引用是会有警告的,因为函数返回后,局部变量的内存将被释放,选用这个例子只是为了测试编译器在返回是临时对象的引用时是怎样处理的。可以看出,即使是返回一个临时对象的引用,编译器也不会为了确保安全而生成一个临时对象返回。

  • 相关阅读:
    PHP生成PDF并转换成图片爬过的坑
    PHAR系列之导言
    Linux学习之路(三)Shell脚本初探
    Linux学习之路(二)
    php 隐藏手机号中间几位
    tp 递归菜单列表【树状】
    php导出excel封装类
    php 导出Excel表格
    php字符串之翻转单词顺序列
    laravel实现跳转其他控制器
  • 原文地址:https://www.cnblogs.com/liujiangyi/p/2643216.html
Copyright © 2011-2022 走看看