1. ホーム
  2. c++

[解決済み】C++で関数にオブジェクトを渡すには?

2022-04-02 22:17:17

質問

私はC++プログラミングの初心者ですが、Javaの経験はあります。C++でオブジェクトを関数に渡す方法について教えてほしいのですが。

ポインタや参照、あるいは非ポインタや非参照の値を渡す必要があるのでしょうか?Javaでは、オブジェクトへの参照を保持する変数だけを渡すので、そのような問題はないと記憶しています。

それぞれのオプションの使用箇所も説明してもらえるとありがたいです。

どのように解決するのですか?

の経験則 C++11:

パス 値で ただし、以下の場合は除きます。

  1. の場合、オブジェクトの所有権は必要なく、単純なエイリアスで十分です。 で渡す。 const 参照 ,
  2. は、オブジェクトを変異させる必要があります。 で渡す。 const lvalue参照 ,
  3. 派生クラスのオブジェクトを基底クラスとして渡す場合、その場合は 参照渡し . (によって渡すかどうかは、前の規則を使用してください)。 const を参照するかどうかです)。

ポインタによる受け渡しは、事実上お勧めできません。オプションのパラメータは std::optional ( boost::optional で、エイリアシングは参照によってうまく行われます。

C++11の移動セマンティクスは、複雑なオブジェクトであっても、値による受け渡しと返しをより魅力的なものにします。


に関する経験則 C++03:

引数を渡す const 参照 ただし、以下の場合は除きます。

  1. は、関数内部で変更され、その変更が外部で反映されるべきものです。 で渡す。 const 参照
  2. この場合、ポインタで渡すことになります。 NULL / 0 / nullptr の代わりに、先ほどのルールを適用してください。 へのポインタを渡します。 const 引数
  3. は、組み込み型であり、これは コピーで渡す
  4. は、関数内部で変更されるものであり、そのような変更は ない が外に反映されます。 コピーで渡す (別の方法として、前の規則に従って渡し、関数の内部でコピーを作成することもできます)

(ここで、"pass by value" は "pass by copy" と呼ばれます。C++03 では値による通過は常にコピーを作成するためです)


この他にもいろいろありますが、このいくつかの初歩的なルールでかなり遠くまで行けると思います。