2

特にOpenCVライブラリを始めて以来、私はしばらくの間この問題に悩まされてきました。実際、OpenCVでは、いくつかの方法が使用されています。

  • 1番目:funcA((const)CvMat arg)
  • 2番目:funcA((const)CvMat&arg)
  • 3番目:funcA((const)CvMat * arg)
  • 4番目:funcA((const)CvMat *&arg)=>見たばかりで、現在これで立ち往生しています

もちろん、各メソッドに対応して、呼び出し元の形式と関数の実装は異なる必要があります。

これらすべての派生物の重要性は何ですか?特に最後のもの(私はまだその使用法を理解していません)

4

1 に答える 1

5

(const)今のところ無視し、int明確にするために使用します。

値渡しは、関数の本体にコピーを作成します

void funcA(int arg) {
  // arg here is a copy
  // anything I do to arg has no effect on caller side.
  arg++; // only has effect locally
}

セマンティックにコピーを作成しますが、コンパイラは特定の条件下でコピーを削除できることに注意してください。コピーの省略を検索する

参照で渡します。呼び出し元から渡された引数を変更できます。

void funcA(int& arg) {
  // arg here is a reference
  // anything I do to arg is seen on caller side.
  arg++;
}

ポインタを値で渡します。ポインタのコピーを取得しましたが、呼び出し元の引数が指す同じオブジェクトを指しています

void funcA(int* arg) {
  // changes to arg do not affect caller's argument
  // BUT I can change the object pointed to
  (*arg)++; // pointer unchanged, pointee changed. Caller sees it.
}

ポインタへの参照を渡します。先のとがったもの自体を変更することができ、発信者に変更が表示されます。

void funcA(int*& arg) {
  // changes to arg affect caller's argument
  // AND I can change the object pointed to.
  (*arg)++; // pointee changed
  arg++; // pointer changed. Caller sees it.
}

ご覧のとおり、次の2つは、ポインターを処理することを除いて、最初の2つとまったく同じです。ポインタの機能を理解していれば、概念的には違いはありません。

に関してconstは、引数を変更できるかどうか、または引数が参照またはポインタの場合は、それらが指す/参照するものを変更できるかどうかを指定します。ここでは、の配置constが重要です。たとえば、constの正当性を参照してください。

于 2012-08-28T07:50:36.000 に答える