1

Manというクラスにupdateというメソッドがあります。私のmain.cppでは、次のように呼び出します。

int age=0;
Man person;
person.Update(age);

これにより、メソッド内の人の年齢が更新されます。ただし、メインファイルに戻ると、更新された経過時間はありません。したがって、変数はクラスメソッドで設定されますが、main.cppコンテキストには戻りません。

編集

Man::Update(int age)
{
    age++;
}
4

3 に答える 3

3

変数の変更を呼び出し元のスコープに反映するには、変数への参照を関数に渡す必要があります。参照が渡されると、関数スコープ内の変数は、呼び出し元スコープ内の変数である/を効果的に参照します。

Man::Update(int &age) //The ampersand reflects that it is a reference
{
    age++;
}

あなたがしていることは、価値の受け渡しと呼ばれています。この場合、変数の新しいコピーが関数スコープに作成され、加えられた変更は呼び出し元のスコープに反映されません。

詳細な説明はこちら、Q&Aスタイルの説明はこちらをご覧ください。

ただし、この特定のケースで実行していることは、クラスまたはメンバー関数をまったく必要としません。これは、単一の通常の機能を使用して実行できます。

于 2012-12-29T14:36:32.087 に答える
3
void Man::Update(int & age)
{
   age++;
}

動作するはずです

于 2012-12-29T14:35:41.307 に答える
2

age引数を値で渡します。これは、関数にコピーされ、Updateそのコピーが変更されることを意味します。引数を参照で渡す必要があります。これは、参照型を提供するため、C++で簡単に実行できます。参照型の名前は、バインドされているオブジェクトのエイリアスとして機能します。&タイプにアンパサンド()を追加するだけです。

void Man::Update(int& age)
{
  age++;
}

あなたがそうするとき、あなたはあなたの関数の参照にperson.Update(age);オブジェクトをバインドしています。ageage

他の人は、ポインタを使用する別の方法を提供するかもしれません(int*引数を取り、関数に渡し&ageます)。これはCで行われる方法ですが、Cを書いているわけではありません。彼らにだまされてはいけません。参照型を使用する方が、ポインターを使用するよりも安全で表現力に優れています。

ただし、なぜあなたがというクラスを持っていて、のメンバーではないのManか疑問に思います。クラスは、関連データをオブジェクトとして一緒に保存する方法です。年齢は男性を表すデータの一部だと思います。ageMan

于 2012-12-29T14:36:54.917 に答える