zoukankan      html  css  js  c++  java
  • [C++]函数返回值

    1.缺省情况下函数的返回值是按值传递的passed by value 这意味着得到控制权的
    函数将接收返回语句中指定的表达式的拷贝例如

    Matrix grow( Matrix* p ) 
    {
        Matrix val;
        // ...
        return val;
    }

    grow()把存储在val 中的值的拷贝返回到调用函数但调用函数不能用任何方式修改val。该缺省行为可以被改变一个函数可以被声明为返回一个指针或一个引用。

    2.1返回一个指向局部对象的引用,局部对象的生命期随函数的结束而结束。

    // 问题: 返回一个指向局部对象的引用
    Matrix& add( Matrix &m1, Matrix &m2 )
    {
        Matrix result;
        if ( m1.isZero() )
            return m2;
        if ( m2.isZero() )
            return m1;
        // 将两个Matrix 对象的内容相加
        // 喔! 返回之后结果指向一个有问题的位置
        return result;
    }

    在这种情况下返回类型应该被声明为非引用类型然后再在局部对象的生命期结束之前拷贝局部变量。

    2.2函数返回一个左值对返回值的任何修改都将改变被返回的实际对象。

    #include <vector>
    int &get_val( vector<int> &vi, int ix ) 
    {
        return vi[ix];
    }
    int ai[4] = { 0, 1, 2, 3 };
    vector<int> vec( ai, ai+4 ); // 将ai 的4 个元素复制到vec
    int main() 
    {
        // 将 vec[0] 增加到 1
        get_val( vec,0 )++;
        // ...
    }

    为防止对引用返回值的无意修改返回值应该被声明为const:

    const int &get_val( ...

    问题:你知道下列函数定义有什么潜在的运行问题吗

    vector<string> &readText( ) 
    {
        vector<string> text;
        string word;
        while ( cin >> word ) 
        {
            text.push_back( word );
            // ...
        }
        // ....
        return text;
    }

    个人觉得有2个办法

    1.不传引用:缺点性能低下。

    2.作为输出参数传递

  • 相关阅读:
    宏定义中的#
    HDU1506 Largest Rectangle in a Histogram 动态规划
    HDU1864 最大报销额 DP
    POJ2771 Guardian of Decency 最大独立子集
    POJ1698 Alice's Chance 最大流
    HDU1003 Max Sum 动态规划
    eval格式化事件类型的字符串
    C#虚方法virtual详解
    c# 利用反射获得某个类或者对象的所有属性
    windows服务的通常写法
  • 原文地址:https://www.cnblogs.com/fjfjfjfjfjfj/p/3094636.html
Copyright © 2011-2022 走看看