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;
    }

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

  • 相关阅读:
    繼續抽像類使用操作改變的問題
    C# 连接池
    简单实用的DataSet更新数据库的类+总结(c#)
    Clone方法
    去掉桌面图标阴影
    第七章 线程的调度、优先级和亲缘性(4)
    第七章 线程的调度、优先级和亲缘性(6)
    windows定时开关机
    Google Chrome 错误 (和诺顿冲突导致崩溃)
    第七章 线程的调度、优先级和亲缘性(7)
  • 原文地址:https://www.cnblogs.com/FlyCat/p/2838859.html
Copyright © 2011-2022 走看看