zoukankan      html  css  js  c++  java
  • 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引用传递无疑是最好的方法。

    作者:zhanjindong
    出处:http://www.cnblogs.com/zhanjindong
    个人博客:http://zhanjindong.com
    关于:一个程序员而已
    说明:目前的技术水平有限,博客定位于学习心得和总结。
  • 相关阅读:
    AC自动机 [模板]
    ChonSu [ZOJ 2684]
    Quad Tiling [POJ 3420]
    LCA 最近公共祖先 [POJ 1330]
    强连通分量[trajan]
    高斯消元 [模板]
    01K Code [HDU 1545]
    Cycle Game [ZOJ 2686]
    清除Eclipse中的内置浏览器中的历史记录(REF)
    第三方的 NET 数据库连接提供者,Lightswitch
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2858454.html
Copyright © 2011-2022 走看看