C++とC#の値の転送と参照の転送

13316 ワード

C++伝達パラメータには3つの形式があり、伝達値、伝達ポインタ、伝達参照があることはよく知られていますが、一般的にC#には伝達値と伝達参照しかありませんが、C#においてもC++パラメータ伝達においても実際には2つしかありません.値伝達と参照伝達では、値伝達はオブジェクトをスタックにコピーし、参照伝達はオブジェクト自体を伝達します.値の伝達と引用の伝達を明らかにする前に必ず引用とポインタの違いを明らかにしなければならない.ポインタの概念は簡単に理解できると思います.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参照転送を採用するのが最善の方法であるに違いない.