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

  • 相关阅读:
    CNN的学习记录
    softmax和softmax loss的学习记录
    Vue2.0 生命周期
    Vue methods 方法
    Vue2.0 全局操作 Vue.set
    Vue2.0 自定义指令 vuedirective
    Vue2.0 构造器的延伸 Vue.extend
    vue computed
    vuecli 脚手架分析
    h5表单介绍与案例
  • 原文地址:https://www.cnblogs.com/liujiangyi/p/2643216.html
Copyright © 2011-2022 走看看