C++和C#中的值传递和引用传递


我们都知道C++传递参数有三种形式,传值,传指针和传引用,而一般C#中只有传值和传引用,但无论是在C#中还是C++参数传递实际上只有两种:值传递和引用传递,值传递就是将对象拷贝一份到栈上,引用传递则传递的就是对象本身。在弄清楚值传递和引用传递之前一定要弄清楚引用指针的区别,指针的概念我想很容易理解,因为在C++中它是实实在在占据内存的一个东东,但是“引用”一词通常容易让初学者混淆,个人认为引用更多是语义上的东西,在C++中把引用就看成是变量本身,调用方法的时候无论传递的是值还是指针,其实传递的都是拷贝,而传递引用的时候即所谓的引用传递传递的就是实参本身。

#include "stdafx.h"
#include <iostream>
using namespace std;

void Func1(int x)
{
    cout<<"实参x的地址:"<<&x<<endl;
    x+=10;
}

void Func2(int *x)
{
    x=new int(30);
    cout<<"实参的地址:"<<&x<<endl;
    cout<<"*x="<<*x<<endl;
    delete(x);
    //(*x)+=10;
}

void Func3(int &x)
{
    cout<<"实参的地址:"<<&x<<endl;
    x=50;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int x=10;

    /*Func1 Test*/
    cout<<"Func1 Test"<<endl;
    cout<<"x="<<x<<",x的地址:"<<&x<<endl;
    Func1(x);
    cout<<"x="<<x<<",x的地址:"<<&x<<endl;

    /*Func2 Test*/
    cout<<"Func2 Test"<<endl;
    cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl;
    Func2(&x);
    cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl;

    /*Func3 Test*/
    cout<<"Func3 Test"<<endl;
    cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl;
    Func3(x);
    cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl;

    cin.get();
    return 0;
}

而在C#中引用语义上更像是C++中的指针,传递引用实际上也是值传递,传递的是拷贝,而C#中实现引用传递需要关键字ref和out。

   class Program
    {
        static void Main(string[] args)
        {
            int x = 10;
            Console.WriteLine("Func1  Test");
            Console.WriteLine("x="+x);
            Func1(x);
            Console.WriteLine("x=" + x);

            Console.WriteLine("Func2  Test");
            Console.WriteLine("x=" + x);
            Func2(ref x);
            Console.WriteLine("x=" + x);


            Console.WriteLine("Func3  Test");
            A a = new A();
            a.X = 10;
            Console.WriteLine("a.X="+a.X);
            Func3(a);
            Console.WriteLine("a.X=" + a.X);

            Console.WriteLine("Func4  Test");
            A b = new A();
            b.X = 10;
            Console.WriteLine("a.X=" + b.X);
            Func4(ref b);
            Console.WriteLine("a.X=" + b.X);

            Console.Read();
        }

        static void Func1(int x)
        {
            x += 10;
            Console.WriteLine("x="+x);
        }

        static void Func2(ref int x)
        {
            x += 10;
            Console.WriteLine("x=" + x);
        }

        static void Func3(A a)
        {
            //a仍然只是实参a的一个拷贝
            a = new A();
            a.X = 20;
            Console.WriteLine("a.X="+a.X);
        }

        static void Func4(ref A a)
        {
            //a就是实参b本身
            a = new A();
            a.X = 20;
            Console.WriteLine("a.X=" + a.X);
        }
    }

    class A
    {
        public int X;
    }

那么到底是指传递还是引用传递呢?值传递的好处是传递时对传人对象的修改实际上是对对象副本的修改,不会影响到原对象的状态(因为传递的是指针或者C#中的引用而影响到原来所指的对象是另外一回事)。按引用传递不需要发生拷贝行为,因此速度更快,特别是大对象的时候,这种优势很明显,如果又不想原对象被修改在C++中采用const引用传递无疑是最好的方法。

优质内容筛选与推荐>>
1、C语言I博客作业11
2、N层架构的一些评论
3、《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---15
4、Python之selenium+pytesseract 实现识别验证码自动化登录脚本
5、常用排序算法


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn