-2

Java の世界での長い冒険の後、C++ に戻ってきて、C++ がポインターを使用する方法の概念/構文を再把握しています。

いくつかの例です。

Javaで

    public void MyFunc(MyClass class) 
    {
        class.DoSomething;
    }

と同じです

    void MyFunc (MyClass* class)
    {
        class->DoSomething;
    }

    public MyClass GetMyClass()
    {
        return class;
    }

と同じです(それを見ると、ここで返されるものをポインターに格納する必要があるため、同じではないことがわかります...)

    MyClasss* GetMyClass()
    {
        return (&class); // could you say here "return <-MyClass"
    }

代わりに、これは同じかもしれません (これは、「&MyClass」にある MyClass のオブジェクトを返すように思われるため、このオブジェクトが返される場所からこの場所で直接編集できます)

    MyClasss GetMyClass()
    {
        return (&class);
    }

-> を使用して、ポインターが指すアドレスに格納されているオブジェクトにアクセスすることもできますが、 <- を使用してアドレスを格納できますか?

最後に、ポイントは何ですか

    void MyFunc(MyClass1 &class1, MyClass2 &class2)

    void MyFunc(MyClass1* class1, MyClass* class2)

例2では、​​使用したいデータのアドレスを渡しているのに対し、最初はアドレスのデータストアに渡していますか?

4

3 に答える 3

3

ポインターは、データ (オブジェクト、構造体、またはプリミティブ型の場合があります) を見つけることができるメモリ アドレスです。と言うとreturn (&object)、メモリアドレス、つまり単一の数値 (たとえば、1736cbfa) が返されます。そのメモリ アドレスを使用すると、 -> 演算子を使用して object の個々の要素にアクセスできます。呼び出し元の関数に何も「プッシュバック」していないため、「<-」演算子は必要ありません。この関数は数値を返すものと考えてください。ただし、必要なデータがどこにあるかを示す特別な種類のマジック ナンバーであり、問​​題はありません。

最終的なポイントに関してvoid MyFunc(MyClass * object)は、データを見つけたメモリアドレス/ポインター/マジックナンバーのコピーを関数に送信します。 void MyFunc(MyClass & object)基本的には裏で同じことをしますが、object1 を直接参照できます (object->element ではなく object.element のように)。この 2 番目の方法は、関数内で object1 を変更する場合に推奨されます。

于 2012-09-20T00:33:14.617 に答える
1

Java 参照型は、C++ ポインターというよりも C++ 参照に似ているため、同様のコードに関するほとんどすべての主張に反対する必要があります。私はそれらを次のように書き直します:

ジャワ:

    public void myFunc(MyClass c) 
    {
        c.doSomething();
    }

C++:
void myFunc (MyClass& クラス) { class.doSomething(); }

2 番目の例については、これは Java でコンパイルすることさえできません。 public MyClass GetMyClass() { return MyClass; }

私はあなたが何かを意味すると思います

    public MyClass getMyClass()
    {
        return new MyClass();
    }

これは C++ でもまったく同じ方法で実行できますが、参照の代わりにポインターを使用します。

    MyClass* getMyClass()
    {
        return new MyClass();
    }

最後の例/質問については、パラメーターを 1 つだけに単純化しましょう。

void myFunc(MyClass c);

void myFunc(MyClass & rc)

void MyFunc(MyClass* pc)

はオブジェクトcで、rcはオブジェクトへの参照であり、 はオブジェクトpcへのポインタです。

これらはすべて用途が異なります。candを使用するための構文rcは似ています。どちらも.、Java の場合と同様に、演算子を使用してメンバーにアクセスします。使用するための構文pcは異なります。ポインターは、*演算子を間接参照に使用し、->演算子をメンバー アクセスに使用します。

より具体的な質問がない限り、ここに他に何を追加すればよいかわかりません。クラスと標準オブジェクト変数を復習して、C++ のスキルを一新することから始めることをお勧めします。それらのハンドルを取得したら、ポインターと参照に進むことができます。

于 2012-09-20T00:40:09.463 に答える
1

仮定:

class MyClass 
{
  public:
    void Foo() {}
}

class OtherClass:
{
  public:
    MyClass GetValue() { return myClass; }
    MyClass& GetRef() { return myClass; }
    MyClass* GetValPtr() { return &myClass; }
  private:
    MyClass myClass;        
}

OtherClass bar;

最初のメソッドは、 myClassという名前のメンバーのコピーを返します。変数を受け取って変更しても、メンバー変数には影響しません。のようにメソッドを呼び出すことができます。インスタンスをコピーして取得したことに注意してください。変数に割り当てない限り、この特定のインスタンスを再利用することはできません。これは内部のメンバーインスタンスを呼び出してい ませんFoobar.GetVal().Foo()MyClassFooMyClassbar

2 番目のメソッドは、メンバー変数への参照を返します。ポインタとは異なり、参照はNULL にすることができないため、参照が使用されます。Fooのようにメソッドにアクセスできますbar.GetRef().Foo()。これにより、内のメンバー インスタンスのメソッドが呼び出されるMyClassbarことに注意してください。

3 番目のメソッドは、メンバー myClass へのポインターを返します。Fooのようにメソッドにアクセスできますbar.GetPtr()->Foo()。これにより、内のメンバー インスタンスのメソッドが呼び出されるMyClassbarことに注意してください。

于 2012-09-20T00:40:49.933 に答える