精华内容
下载资源
问答
  • 引用传参

    2018-12-04 21:54:00
    #include "widget.h" #include <QVBoxLayout> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) ... QPushButton *button=new QPushButton(QString::fromLocal8Bit(...
    #include "widget.h"
    #include <QVBoxLayout>
    #include <QDebug>
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        QPushButton *button=new QPushButton(QString::fromLocal8Bit("Button"),this);
        QVBoxLayout *layout=new QVBoxLayout(this);
        layout->addWidget(button);
        setLayout(layout);
        myScanf(m_list);
        connect(button,&QPushButton::clicked, this, &Widget::myPrint);
        resize(200, 100);
    }
    void Widget::myScanf(QList<QStringList> &list)
    {
        for(int i=0;i<5;i++)
        {
            QStringList strList;
            for(int j=0;j<9;j++)
            {
                strList<<QString("hrlok %1").arg(j);
            }
            list.append(strList);
        }
    }
    
    void Widget::myPrint()
    {
        for(int i=0; i<m_list.size();i++)
           qDebug()<<m_list.at(i);
    }
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QList>
    #include <QStringList>
    #include <QString>
    #include <QPushButton>
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = 0);
        ~Widget(){};
        void myScanf(QList<QStringList> &list);
        QList<QStringList> m_list;
    protected slots:
        void myPrint();
    };
    
    #endif // WIDGET_H
    #include "widget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    按键按下,输出
    ("hrlok 0", "hrlok 1", "hrlok 2", "hrlok 3", "hrlok 4", "hrlok 5", "hrlok 6", "hrlok 7", "hrlok 8")
    ("hrlok 0", "hrlok 1", "hrlok 2", "hrlok 3", "hrlok 4", "hrlok 5", "hrlok 6", "hrlok 7", "hrlok 8")
    ("hrlok 0", "hrlok 1", "hrlok 2", "hrlok 3", "hrlok 4", "hrlok 5", "hrlok 6", "hrlok 7", "hrlok 8")
    ("hrlok 0", "hrlok 1", "hrlok 2", "hrlok 3", "hrlok 4", "hrlok 5", "hrlok 6", "hrlok 7", "hrlok 8")
    ("hrlok 0", "hrlok 1", "hrlok 2", "hrlok 3", "hrlok 4", "hrlok 5", "hrlok 6", "hrlok 7", "hrlok 8")

     

    转载于:https://www.cnblogs.com/wangbin-heng/p/10067595.html

    展开全文
  • 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)函数式代码
        }
    }
    

     

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

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

    3种传参方式:值传参、指针传参、引用传参

    我们知道传参方式有3种:值传参、指针传参、引用传参。这三种方式书写方式各有不同,接下来,我们简单介绍3种传参方式实现的机制。首先看一个程序:这个程序实现的是交换2个变量的值。

    #include <iostream>
    //交换函数
    void val_swap(int a, int b);   //值传参
    void ptr_swap(int *a, int *b); //指针传参
    void ref_swap(int &a, int &b); //引用传参
    int main(int argc, char* argv[])
    {
        int a = 10, b = 20;
        std::cout << "值传参前,a = " << a << ", b = " << b << std::endl;
        val_swap(a,b);
        std::cout << "值传参后,a = " << a << ", b = " << b << std::endl;
        std::cout << std::endl;
    
        std::cout << "指针传参前,a = " << a << ", b = " << b << std::endl;
        ptr_swap(&a, &b);
        std::cout << "指针传参后,a = " << a << ", b = " << b << std::endl;
        std::cout << std::endl;
    
    
        std::cout << "引用传参前,a = " << a << ", b = " << b << std::endl;
        ref_swap(a, b);
        std::cout << "引用传参后,a = " << a << ", b = " << b << std::endl;
        std::cout << std::endl;
    
        getchar();
        return 0;
    
    }
    
    void val_swap(int a, int b) {
        int temp = a;
        a = b;
        b = a;
    }
    void ptr_swap(int *a, int *b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void ref_swap(int &a, int &b) {
        int temp = a;
        a = b;
        b = temp;
    }

    实现结果:

    1. 值传参并没有实现交换功能。我们可以通过反汇编查看一下它的内部实现机制。汇编代码如下。
    31:     int temp = p;
    01301D1E  mov         eax,dword ptr [p]  
    01301D21  mov         dword ptr [temp],eax  
        32:     p = q;
    01301D24  mov         eax,dword ptr [q]  
    01301D27  mov         dword ptr [p],eax  
        33:     q = temp;
    01301D2A  mov         eax,dword ptr [p]  
    01301D2D  mov         dword ptr [q],eax  

    从汇编指令可以看出,函数值传参是把所传的值压栈,然后赋值给形参,例如主函数中的a传给p时,先将a压栈,然后将这个栈地址所指向的值赋值给p。这样操作的话,就是局部变量之间的交换,而不是外部变量的交换,所以值传参交换失败。

    2.指针传参

    36:     int temp = *p;
    01301C9E  mov         eax,dword ptr [p]  
    01301CA1  mov         ecx,dword ptr [eax]  
    01301CA3  mov         dword ptr [temp],ecx  
        37:     *p = *q;
    01301CA6  mov         eax,dword ptr [p]  
    01301CA9  mov         ecx,dword ptr [q]  
    01301CAC  mov         edx,dword ptr [ecx]  
    01301CAE  mov         dword ptr [eax],edx  
        38:     *q = temp;
    01301CB0  mov         eax,dword ptr [q]  
    01301CB3  mov         ecx,dword ptr [temp]  
    01301CB6  mov         dword ptr [eax],ecx 

    指针传参是将该实参的地址传给形参,在调用的过程中,通过地址去寻找相应值进行交换,所以指针传参交换成功。
    3. 引用传参

    42:     int temp = p;
    01301CDE  mov         eax,dword ptr [p]  
    01301CE1  mov         ecx,dword ptr [eax]  
    01301CE3  mov         dword ptr [temp],ecx  
        43:     p = q;
    01301CE6  mov         eax,dword ptr [p]  
    01301CE9  mov         ecx,dword ptr [q]  
    01301CEC  mov         edx,dword ptr [ecx]  
    01301CEE  mov         dword ptr [eax],edx  
        44:     q = temp;
    01301CF0  mov         eax,dword ptr [q]  
    01301CF3  mov         ecx,dword ptr [temp]  
    01301CF6  mov         dword ptr [eax],ecx  

    引用传参与指针传参实现的机制完全相同,这涉及到引用的本质是指针常量。但是引用在传参方面有更简洁,不会出现书写的错误。

    常量引用传参

    由上面我们可以得知,普通的指针传参和引用传参的实现机制是完全相同的,但是引用传参书写更加简洁。

    引用有一个特殊的传参方式:常量引用传参,该方式用于在函数体内部不想改变形参的值。
    比如:
    Void func(const int &a);
    这样传参的方式,函数体内部不能够改变变量a的值,而且这样写的程序更加规范,如果该函数体是这样写的:
    Void func(int &a);
    那么,如果我有一个const int a的值要传给这个函数将会报错。

    传值与传引用的效率对比

    请见博客:http://www.cnblogs.com/QG-whz/p/5129173.html

    总结:

    1. 传值调用(Call by Value):函数(方法)在调用参数时,不是对原参数进行操作,而是创建参数的拷贝并对其进行操作,即只是利用它来进行其他计算而不改变其值。
    2. 引用是独占的,即一旦创建了引用并初始化为某特定对象,它将总是引用此对象,给引用赋值并不会使它“指向”另外的对象,只是改变了对象的值。
    3. 传地址:是传值的一种特殊方式,只是它传递的是地址,不是普通的如int 。那么传地址以后,实参 和行参都指向同一个对象。

    4. 以下是必须使用引用传参的情况:
      1:当大型的类对象必须作为参数传递时对实际的应用程序而言分配对象并拷贝到栈中的时间和空间开销往往过大.
      2:当实参的值必须被修改时,例如在函数swap()中用户想改变实参的值但是在按值传递的情况下无法做到.

    5. 使用常量引用的情况: 在函数体内部不想改变形参的值
    6. 对内置类型来说,通常传值更高效。对用于自定义类型来所,传值要经历构造与析构过程,一般比较耗时
    展开全文
  • 普通传参和引用传参

    千次阅读 2018-10-03 14:24:22
    引用传参 int &amp;x一般只用于函数的参数中,而int x不只用在函数传参的过程。 int &amp;x写作参数时,传递变量是该实参的引用类型,函数执行过程可以改变实参的值;而int y传递的是实参的拷贝,函数执行...
    • 引用传参 int &x一般只用于函数的参数中,而int x不只用在函数传参的过程。
    • int &x写作参数时,传递变量是该实参的引用类型,函数执行过程可以改变实参的值;而int y传递的是实参的拷贝,函数执行后不改变实参的值。
    • 在程序参数类型选择时需要根据具体的需要而选择合适的类型进行声明。
    #include<iostream>
    using namespace std;
    void method1(int x,int y){
        int z=x;
        x=y;
        y=z;
    }
    void method2(int &x,int &y){
        int z=x;
        x=y;
        y=z;
    }
    int main()
    {
        int a,b;
        cin>>a>>b;
        method1(a,b);
        cout<<"第一种:"<<"a="<<a<<" b="<<b<<endl;
        method2(a,b);
        cout<<"第二种:"<<"a="<<a<<" b="<<b<<endl;
        return 0;
    }
    展开全文
  • 一直以来,我对于 C++ 的传参方式只有皮毛上的了解而没有深入其里的探讨。正好,最近在学习《Data Stuctures And Algorithms Analysis In Cpp 4th Edition》这本书的时候,看到作者介绍 C++ 及其 C++11 的传值调用的...
  • 值传参和引用传参

    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");
  • 在C++中,如果函数的实参的类型是数据类型比较大的数据类型...其实引用传参和指针传参都能够在条用函数内部对源数据进行修改,这是它们的共同点,但是它们也是有区别的。下面是一个例子: #include &lt;iostr...
  • 1、值传参,对形参的任何操作都不会对实参产生影响 1.1:值传参方法 //值传参 void NoChangeValue(int v) { printf("值传参修改前的值 = %d\n", v); v = 10; printf("值传参修改...
  • 问:引用传参和值传参的区别是什么? 我:1、引用是别名,不占用内存空间,值是要占用内存空间。2、引用会改变所引用变量的值,而值传参不会。 接着,他就顺着我问:为什么引用传参会改变所引用的值,而值传参不会...
  • 指针的引用传参

    2020-08-02 00:30:11
    因为C语言不支持引用传参,有时候我们想在被调用函数中修改调用函数传进来的参数的地址,并让它在返回后仍然有效,这时候能用到的就是指针的指针。或者说是指针的引用。 #include <stdio.h> #include...
  • 主要介绍了Go 到底有没有引用传参(对比 C++ ),需要的朋友可以参考下
  • 一个人学Java太孤独,小伙伴陪你一起学哦也可以加小刀微信,进群一起学习best396975802结合视频所述,引用传参和值传参最大的区别就是,在方法内,如果对传入的参数修改会影响到外面...
  • matlab 引用传参

    千次阅读 2015-10-10 20:49:43
    matlab中没有引用传参,因此如果需要类似ref的功能,可以采用以下办法: 1. 将参数返回出来: 在定义函数的时候例: function X=exchange(A); 可以在函数里面,将exchange之后的A赋值给X,就相当于A 返回出来了。 ...
  • Java小记——Java中String引用传参

    千次阅读 2018-05-22 20:09:19
    java小记:Java中String引用传参我们知道在java中字符串(Stirng)对象和其他对象不太一样,是不可变的,所以再作为参数传递的时候和基本类型一样,都是“值传参”,要想达到“引用传参”的效果,就要使用...
  • $a = 'zzz'; function show(){ global $a; $a = 'qqq'; } show(); echo $a; 输出:qqq 结论:引用传参
  • 今天cici网友发来一个问题, 说是在函数调用参数前面使用错误抑制符号(@)的时候, 貌似引用传参就失效了. 他想让我帮他解答为什么.
  • foreach中使用引用传参造成的错误背景发现问题原理分析解决方案 背景 同事写的代码,上传数据的时候,总是会最后一条数据被上一条数据覆盖掉,导致倒数第二条数据出现两次,最后一条数据丢失 发现问题 经排查,是对...
  • java 中基础类型是值传参,对象类型是引用传参 对象类型: new出来的都是, 包括数组 2. 值传参举例 public class Main { public static void main(String[] args) { int x = 3; Main.swap(x); System.out....
  • 2,函数的引用传参 例子: 以上代码是正确的,(将对象o的所有属性分别复制给p1对象)上图中的p1指向{}对象,o.copy中的o也指向{}对象,他们两个都是指的同一个,这就是引用类型跟值类型的主要区别,值类型是...
  • 个人认为C++函数传参的一个指导性原则是:若函数的形参是非引用类型,传参时实际上是使用复制实参的值给形参,是实参值的副本,而非真正的实参;若函数的形参是引用类型的,则传递的其实就是实参本身,形参只不过是...
  • //by 鸟哥 演示 shared_ptr 不增加引用计数的情况 //有疑问请留言或加群 1032082534 #include <iostream> #include <memory> using namespace std;..."按引用传参不增加引用计数:"...
  • 1.1 代码实例 package st; public class Apple { public static void yinYong...引用传参。&amp;amp;quot;); System.out.println(&amp;amp;quot;yinYong里面的str:&amp;amp;quot; + &amp;amp;quot;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,561
精华内容 1,424
关键字:

引用传参