2016-07-13 7 views
1

これはC++で他の言語のようにできるかどうかわかりません。物はコピーのように振る舞いますが、同じオブジェクトではありません。私はこれが構造体、または他の値型の場合、これは予想される動作ですが、クラスに対しては、私は "参照"を見ているように振舞うと期待していました。つまり、同じオブジェクトが配列にあります。私は間違って何をしていますか?オブジェクトmymoreofthem[1]のコピーではなく、リファレンスであるためだ配列のclass要素が変更されたとき、参照ではなくコピーのように振る舞う

// Example program 
#include <iostream> 
#include <string> 


class someclass 
{ 
    public:   
    void setn(int n2); 
    int n=10; 
}; 

void someclass::setn(int n2){ 
    n=n2; 
}; 


int main() 
{ 
    someclass moreofthem[5]; 
    someclass my=moreofthem[1]; 
    std::cout << "start value: " << my.n << " as inital\n"; //10 
    my.setn(2); 
    std::cout << "new value: " << my.n << " as expected\n"; //2 
    std::cout << "value in list: " << moreofthem[1].n << " why?\n"; //10? 

} 
+2

あなたは 'class'と' struct'はC++の2つの異なる概念だと思うようです。ではない。唯一の違いは、デフォルトのアクセス指定子 – user463035818

+0

です。まあ、私はいくつかの経験がありました。NETと私は同じ概念を使用してC + +でプレイしようとしましたが、明らかにそのように動作しません。 – nekitip

答えて

4

あなたは、変数を定義するときにアンパサンドを使用する必要が参照したい場合:

someclass& my=moreofthem[1]; 
//  ^
// Note ampersand here 
3

を、私は、これは構造体、または他のいくつかの値型だった場合という期待 - これは振る舞いを期待されますクラスのために...

キーワードclassstructは、同じ意味で使用できます。唯一の違いは、アクセス権を指定しない場合、デフォルトは だろう修飾子、ということである:

  • public言っ

class

  • privatestructで、

    someclass& my=moreofthem[1]; 
    

    が参考になり、それがあなたが探しているものです。ここでのC#とは異なりmoreofthem[1]

  • 5

    元の変数のエイリアス等参照my作用は、C++はstructclassを区別しません。実際には、2つはcompletely interchangeableであり、値semanticに従います。

    幸いなことに、C++はまた、あなたがクラスや構造体のインスタンスへの参照を扱うましょう言語構造、などの参照やポインタを提供します。

    someclass moreofthem[5]; 
    someclass& my = moreofthem[1]; 
    //  ^
    // That's it! Now you have yourself a reference 
    std::cout << "start value: " << my.n << " as inital\n"; //10 
    my.setn(2); 
    

    やC#とは異なり、あなたがポインタを好む場合

    someclass moreofthem[5]; 
    someclass* my = &moreofthem[1]; 
    //  ^ ^
    // declare and use a pointer; note -> below 
    std::cout << "start value: " << my.n << " as inital\n"; //10 
    my->setn(2); 
    

    ここでclassは、インスタンスが参照(C++参照とC++ポインタの混合を表す)によって確実に処理されることを保証します。C++では、値、参照、またはポインタによるインスタンスの処理方法を決定できます。この振る舞いは、値型のオブジェクトを渡すC#のrefパラメータに近いですが、インスタンス変数とローカル変数を含むすべてのコンテキストで使用できます。これにより、参照または値によって異なるコンテキストで同じオブジェクトを処理する柔軟性が向上します。

    関連する問題