2016-06-30 2 views
6

私は次のクラスがあるとします。これは定義されていますか?

struct A{ 
    void method(A& otherA) const{ 
    /* Mutate otherA */ 
    } 
}; 

をし、後で私はこれがあります。

A myA; 
myA.method(myA); 

を私はmethodthisインスタンスが変更されないことをコンパイラに告げてきたが、コンパイラがいることをわかっていませんパラメータとしてthisインスタンスを渡すことはできますか?

私はこれを行うことによってものを壊すことができますか?これは定義された動作ですか?

+0

はいできます。コンパイラは、それらが同じインスタンスかどうかを知ることができませんでした。渡されたパラメータを変更したくない場合は、パラメータ型を 'const'にする必要があります。 – songyuanyao

+0

@songyuanyaoいいえ...しかし、私はそれを変更したいです – DarthRubik

+0

それは大丈夫でしょう。渡された引数で変更することができます。 – songyuanyao

答えて

10

これは完全に問題ありません。この例では、2つの引数が実際に同じオブジェクトを参照するときに、「エイリアス」と呼ばれることもあります。

プレーンCでさえ簡単場合を考える:

void foo(int* a, const int* b) { *a += *b; } 

すなわち機能はint Sへの2つのポインタをとり、最初のものに第二1を加算します。そしてもちろん、私のfoo機能を使用するには、このコードは完全に有効です:

int x = 10; 
foo(&x, &x); // now x is 20 

あなたは、この場合には、その行動が気に入らない場合は、行うための最善のことは

のようなあなたのメソッド内でチェックを追加することでしょう
void A::method(A& otherA) const { 
    if (this == &otherA) { /* aliasing detected */ } 
    else { /* proceed as normal */ } 
} 
+0

私の主な関心事は、私のプログラムが "未定義の動作"に依存している可能性があるということでした。 – DarthRubik

関連する問題