精华内容
下载资源
问答
  • Java 流式操作 Stream(15)面向对象引用传参&&函数式引用传参 package com.lius.stream; import java.util.function.Consumer; import java.util.function.IntConsumer; /** * <p>面向对象引用...

     Java 流式操作 Stream(15) 面向对象引用传参&&函数式引用传参

    package com.lius.stream;
    
    import java.util.function.Consumer;
    import java.util.function.IntConsumer;
    
    /**
     * <p>面向对象引用传参&&函数式引用传参</p>
     * <p>1.面向对象引用传参传递的是调用的是类以及类实例本身</p>
     * <p>2.函数式引用传参传递的是调用的是类以及类实例的函数式代码</p>
     */
    public class streamTest9 {
    
        /**
         * 测试对象引用传参以及函数式引用传参方法
         * @param consumer
         */
        private static void testConsumer(Consumer<Integer> consumer){
            consumer.accept(1000);
        }
    
        public static void main(String[] args) {
            //创建Consumer以及IntConsumer函数表达式
            Consumer<Integer> consumer = i->System.out.println(i);
            IntConsumer intConsumer = i->System.out.println(i);
            //测试对象引用传参
            testConsumer(consumer);//1000  传递的是consumer对象
    //        testConsumer(intConsumer);//报错 传递的是intConsumer对象
            //测试函数式引用传参
            testConsumer(consumer::accept);//1000   传递的是i->System.out.println(i)函数式代码
            testConsumer(intConsumer::accept);//1000  传递的是i->System.out.println(i)函数式代码
        }
    }
    

     

    展开全文
  • 2,引用传参 -> 将变量的引用传入函数,效果和指针相同。 3,值传参 -> 在传参过程中,首先将c的值复制给函数c变量,然后在函数中修改的即是函数的c变量,然后函数返回时,系统自动释放变量c。而对main函数...

    • 解析:
    • 该题考察函数传参问题。
    • 1,指针传参 -> 将变量的地址直接传入函数,函数中可以对其值进行修改。
    • 2,引用传参 -> 将变量的引用传入函数,效果和指针相同。
    • 3,值传参 -> 在传参过程中,首先将c的值复制给函数c变量,然后在函数中修改的即是函数的c变量,然后函数返回时,系统自动释放变量c。而对main函数的c没有影响。
    • a为指针传递,b为引用传递,c为值传递。
    • *a = 20; b = 30; a和b的值确实发生了修改。而c只是将值复制到形参,在函数内的操作并不会影响c的实际值,因此c还是为原来的30.
    • image

    展开全文
  • 一直以来,我对于 C++ 的传参方式只有皮毛上的了解而没有深入其里的探讨。正好,最近在学习《Data Stuctures And Algorithms Analysis In Cpp 4th Edition》这本书的时候,看到作者介绍 C++ 及其 C++11 的传值调用的...

    一、引言

    一直以来,我对于 C++ 的传参方式只有皮毛上的了解而没有深入其里的探讨。正好,最近在学习《Data Stuctures And Algorithms Analysis In Cpp 4th Edition》这本书的时候,看到作者介绍 C++ 及其 C++11 的传值调用的四种方式的时候,顿觉恍然大悟,有种想要整理一下分享给广大网友的冲动,因此写下了这篇博客。

    在这篇博客里,我会像作者那样,首先介绍下传统 C++ 和 C++11 新增的共四种传参方式,然后总结四种传参方式的特点,最后探讨下在实际开发过程中我们该如何选择的问题。

    ps: 本篇博客大量参考了《Data Structures And Algorithms Analysis In Cpp 4th Edition》中的解释和代码。也大力推荐各位网友看看这本书,讲解的非常细致到位。

    二、传统 C++ 的三种传参方式

    我们知道 C 和 Java 都只有一种传参方式,那就是按值传参。

    然而,对于 C++ 来说,按值传递一个非常复杂的对象是非常耗费资源的,也是非常低效的。

    因此,传统 C++ 理论上是存在三种传参方式的,除了最基本的按值传参,还衍生出来了按引用传参,以及按常量引用传参。

    1. 按值传参
    按值传参的概念非常好理解,就是函数接收到了传递过来的参数后,将其拷贝一份,其函数内部执行的代码操作的都是传递参数的拷贝。

    也就是说,按值传参最大的特点就是不会影响到传递过来的参数的值,但因为拷贝了一份副本,会更浪费资源一些。

    double average( double a, double b);
    double z = average( x, y );
    

    当调用了 average 函数之后,按值传参就会将 x 复制给 a,y 复制给 b。因此不会影响到原来的 x 和 y 的值。

    2. 按(左值)引用传参
    按值传参不会影响到原来的参数的值,那么问题来了,如果我们就是想要对参数进行一些修改,怎么办呢?这时候按(左值)引用传参就应运而生了。

    void swap ( double & a, double & b);
    swap( x, y);
    

    当我们调用 swap 的时候,a 相当于 x 的别名,b 相当于 y 的别名,对于 a 和 b 的修改,同时也就应用到了 x 和 y 上面。

    也就是说,当我们想要对传入参数进行一些修改的时候,按(左值)引用传参绝对是最适合的。

    3. 按常量引用传参
    我们之前说了,如果想要对传入参数进行一些修改,我们要使用按(左值)引用传参,那么我们不想要对传入参数进行修改,是不是就只能使用按值传参了呢?我们能不能既拥有引用的节省拷贝开支的优点,又拥有按值传参的不影响原值的优点呢?

    于是乎,按常量引用传参也就应运而生了。如果我们只是想要看一看参数的值,而并不需要去修改它,我们就可以使用按常量引用传值,从而减少拷贝方面的开销。

    string randomItem( const vector<string> & arr );
    vector<string> v { "hello", "world" };
    cout << randomItem( v ) << endl;
    

    此时,我们使用按常量引用传参就会比按值传参节省一次拷贝开销。

    三、C++11 新增的按右值引用传参

    C++11 全面引入移动语义:

    x = y
    can be a copy if y is an lvalue,
    but a move if y is an rvalue.

    对于右值来说,其存储的是临时的将要被摧毁的资源,移动一个对象的状态总会比赋值这个对象的状态要来的简单(开销小)。

    string randomItem( vector<string> && arr );
    vector<string> v { "hello", "world" };
    cout << randomItem( { "hello", "world" }) << endl;
    

    四、实际开发中该如何选择

    我们上面说了四种传参方式,那么实际开发中,我们该如何选择呢?

    这里我特地画了一个图:

    在这里插入图片描述

    希望能给大家一些帮助 ^_^

    五、总结

    熟悉 C++ 的四种传参方式,其实是一件很重要的事情,其直观反映到了我们编写的代码中去。尽管按值传参大部分情况下都能够使用,但是合适的情况下使用合适的传参方式体现了我们对于 C++ 的理解深度。

    另外,或许有人会问,诶,不是还有一种按地址传参的方式吗?

    我们来仔细想想,按地址传参,其实不就是按值传参吗?传递的就是参数的地址而已。

    不得不说 《Data Stuctures And Algorithms Analysis In Cpp 4th Edition》真是一本好书,很多时候能让我有不一样的领悟和感慨。也由衷的推荐给大家!

    To be Stronger:)

    展开全文
  • 引用传参和指针传参

    因为数据结构的算法设计题要求手写代码,书上函数的形参部分中用到了c++里引用(&)的概念,当时老师只讲了“在形参前面加&符号可以改变传进来的实参的值,如果不熟悉引用也可以用指针传参去改变实参的值”。
    现在打算后面统一用引用传参的形式,原因如下:

    • 教材和各种辅导书都是用的引用传参,方便核对答案;
    • 指针传参有两方面缺点:
      (1)如果用指针传参的话,需要在函数里重复使用“*指针变量名”的形式来对实参进行操作,容易产生错误且程序的阅读性较差;
      (2)在主调函数的调用点处,需要用变量的地址作为实参,而这就导致需要额外定义一个该变量类型的指向该变量的指针;

    函数通过指针传参:

    int Init_by_pointer(SqList *pL, Elemtype e1, Elemtype e2)
    {
        //Initial sequence list L = (e1, e2) by using pointer pL
        (*pL).base = (Elemtype *)malloc(INIT_LIST_SIZE * sizeof(Elemtype));
        if(!(*pL).base) exit(-1);
        (*pL).length = 2;
        (*pL).listsize = INIT_LIST_SIZE;
        (*pL).base[0] = e1;
        (*pL).base[1] = e2;
        return 0;
    }
    

    函数通过引用传参:

    int Init_by_reference(SqList &L, Elemtype e1, Elemtype e2)
    {
        //Initial sequence list L = (e1, e2) by using reference &L
        L.base = (Elemtype *)malloc(INIT_LIST_SIZE * sizeof(Elemtype));
        if(!L.base) exit(-1);
        L.length = 2;
        L.listsize = INIT_LIST_SIZE;
        L.base[0] = e1;
        L.base[1] = e2;
        return 0;
    }
    

    主函数部分:

    #include <stdio.h>
    #include <stdlib.h>
    #include <status.h>
    
    #define INIT_LIST_SIZE 10
    
    typedef struct SqList
    {
        Elemtype *base;
        int length;
        int listsize;
    }SqList;
    
    int main(void)
    {
        SqList L1;
        SqList *pL1 = &L1; //额外定义
        Init_by_pointer(pL1, 1, 2);
        printf("L1 = (%d, %d)\n", L1.base[0], L1.base[1]);
    
        SqList L2;
        Init_by_reference(L2, 3, 4);
        printf("L2 = (%d, %d)\n", L2.base[0], L2.base[1]);
        return 0;
    }
    

    结果:显然这两种方式实现的效果是一样的
    在这里插入图片描述

    引用的原理:从编译的角度来讲,在创建符号表的时候,引用在符号表上对应的地址值为引用对象的地址值(与实参名字不同,地址相同)。所以我理解的“引用”实际上就是一个变量的“别名”,所以任何对于引用参数的处理都会通过寻址,操作到主调函数中的相关变量(即实参)。

    展开全文
  • 值传参、指针传参、引用传参

    千次阅读 2017-07-02 01:46:25
    3种传参方式:值传参、指针传参、引用传参我们知道传参方式有3种:值传参、指针传参、引用传参。这三种方式书写方式各有不同,接下来,我们简单介绍3种传参方式实现的机制。首先看一个程序:这个程序实现的是交换2个...
  • bind引用传参

    2021-07-03 21:49:53
    bind引用传参 std::bind的函数参数默认使用的是拷贝, 如果需要使用引用,则需要配合std::ref。 下面一个例子,帮助理解。print2函数负责输出参数的值,且参数都是引用, print2函数内完成对参数的自增 #include <...
  • 普通传参和引用传参

    千次阅读 2018-10-03 14:24:22
    引用传参 int &amp;x一般只用于函数的参数中,而int x不只用在函数传参的过程。 int &amp;x写作参数时,传递变量是该实参的引用类型,函数执行过程可以改变实参的值;而int y传递的是实参的拷贝,函数执行...
  • 主要介绍了Go 到底有没有引用传参(对比 C++ ),需要的朋友可以参考下
  • 值传参和引用传参

    2017-11-25 09:20:40
    值传参和引用传参问题 @Test public void referTest(){ String a = "a"; String b = "b"; StringBuilder A = new StringBuilder("A"); StringBuilder B = new StringBuilder("B");
  • 1、值传参,对形参的任何操作都不会对实参产生影响 1.1:值传参方法 //值传参 void NoChangeValue(int v) { printf("值传参修改前的值 = %d\n", v); v = 10; printf("值传参修改后的值 = %d\n", v); } 1.2:主...
  • 在C++中,如果函数的实参的类型是数据类型比较大的数据类型...其实引用传参和指针传参都能够在条用函数内部对源数据进行修改,这是它们的共同点,但是它们也是有区别的。下面是一个例子: #include &lt;iostr...
  • Java小记——Java中String引用传参

    千次阅读 2018-05-22 20:09:19
    java小记:Java中String引用传参我们知道在java中字符串(Stirng)对象和其他对象不太一样,是不可变的,所以再作为参数传递的时候和基本类型一样,都是“值传参”,要想达到“引用传参”的效果,就要使用...
  • 指针的引用传参

    2020-08-02 00:30:11
    因为C语言不支持引用传参,有时候我们想在被调用函数中修改调用函数传进来的参数的地址,并让它在返回后仍然有效,这时候能用到的就是指针的指针。或者说是指针的引用。 #include <stdio.h> #include...
  • 引用传参、引用作为函数返回值) (10 分) 某商店开展买一送一活动,购买两件商品时,只需支付价格较高的商品的金额。要求程序在输入两个商品的价格后,输出所应支付的金额,请根据...
  • 问:引用传参和值传参的区别是什么? 我:1、引用是别名,不占用内存空间,值是要占用内存空间。2、引用会改变所引用变量的值,而值传参不会。 接着,他就顺着我问:为什么引用传参会改变所引用的值,而值传参不会...
  • 参数的传递前面讲过有值传递和指针传递,其实引用也是可以进行参数传递的,并且在工作和项目中,引用传参是一种比较常用并且比较好理解的方式。下面我们进入引用传参之路。。。 在上路之前,先回顾一下值传递和指针...
  • matlab 引用传参

    千次阅读 2015-10-10 20:49:43
    matlab中没有引用传参,因此如果需要类似ref的功能,可以采用以下办法: 1. 将参数返回出来: 在定义函数的时候例: function X=exchange(A); 可以在函数里面,将exchange之后的A赋值给X,就相当于A 返回出来了。 ...
  • 一个人学Java太孤独,小伙伴陪你一起学哦也可以加小刀微信,进群一起学习best396975802结合视频所述,引用传参和值传参最大的区别就是,在方法内,如果对传入的参数修改会影响到外面...
  • 【C++】3-1.2 c++通过引用传参1.运行环境2.引用传参示例3.其它传参4.总结 1.运行环境 操作系统:windows10 使用的IDE:visual studio comunity 2019 编译器标准:ISO C++17 标准 (std:c++17) 2.引用传参示例 # ...
  • 今天cici网友发来一个问题, 说是在函数调用参数前面使用错误抑制符号(@)的时候, 貌似引用传参就失效了. 他想让我帮他解答为什么.
  • #关于java爬虫中-jsoup-Document引用传参。# 事情是这样的,新手上路。 我把Document创建了个对象,注意! ##Import 有两个 Document !!## 这时,你应该注意这个document的提供包 javax.swing.text.Document; ...
  • foreach中使用引用传参造成的错误背景发现问题原理分析解决方案 背景 同事写的代码,上传数据的时候,总是会最后一条数据被上一条数据覆盖掉,导致倒数第二条数据出现两次,最后一条数据丢失 发现问题 经排查,是对...
  • //by 鸟哥 演示 shared_ptr 不增加引用计数的情况 //有疑问请留言或加群 1032082534 #include <iostream> #include <memory> using namespace std;..."按引用传参不增加引用计数:"...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,699
精华内容 29,479
关键字:

引用传参