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

    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    class MyClass
    {
    public:
        static int num;
        int data;
        void DisplayData()
        {
            cout<<"Initializion"<<data<<"\n";
        }
        MyClass()
        {
            cout<<"MyClass Create\n";
            num++;
        }
        MyClass(const MyClass& r)
        {
            data=r.data;
            cout<<"MyClass Copy Create\n";
            num++;
        }
        ~MyClass()
        {
            num--;
            cout<<"MyClass Dispose\n";
        }
        MyClass operator=(const MyClass& r)
        {
            cout<<"operator=\n";
            return *this;
        }
    };
    int MyClass::num=0;
    MyClass MakeClass1()
    {
        MyClass P;
        P.data=10;
        return P;
    }
    void Test()
    {
        MyClass temp1=MakeClass1();//用返回值初始化变量
    
        MyClass &temp=MakeClass1();
        temp.DisplayData();
        //根据C++标准,临时变量或对象在一个完整语句表达式后便宣告结束
        //某些编译器对C++进行了扩展,如果临时变量或对象作为引用初始化时,则其生命期与该引用一致
        //所以定义temp或者 &temp的结果一样,但是这样依赖编译器实现,最好应该:
    
        //MyClass x=MakeClass1();
        //MyClass & temp=x;
    
    }
    
    MyClass& MakeClass2()
    {
        MyClass P;
        P.data=10;
        return P;
    }
    void Test2()
    {
        //MyClass temp1=MakeClass2();//调用拷贝构造函数
        //temp1.DisplayData();//10
    
        MyClass &temp=MakeClass2();//调用正确,原因和Test1中一样,但不推荐使用
        temp.DisplayData();//10
    
    }
    
    void Test3()
    {
        //=重载返回类型测试,=重载一般用引用返回,以免多调用一次拷贝构造函数
        MyClass c1;
        MyClass c2;
        MyClass c3;
    
        c1=c2=c3;
    }
    int main(int cnt,char *argv[])
    {
        //Test();
        //Test2();
        Test3();
        cout<<MyClass::num<<endl;
    
        return 0;
    }

    觉得一般来说,函数返回值除了等号重载,最好不要用引用返回,以免带来不必要的复杂

  • 相关阅读:
    python 利用正则表达的式提取特定数据如手机号
    python 横向比较最大值 贴标签
    Go语言基础之17--Redis基本操作
    Mysql5.7.20源码编译安装
    Go语言基础之16--Mysql基本操作
    Go语言学习包(1)之bufio包
    Go语言基础之15--文件基本操作
    Go语言基础练习题系列5
    Go语言基础之14--Waitgroup和原子操作
    Go语言基础之13--线程安全及互斥锁和读写锁
  • 原文地址:https://www.cnblogs.com/FlyCat/p/2838859.html
Copyright © 2011-2022 走看看