14

Google C++ スタイル ガイドでは、入力パラメーター (→ const ref、値) と入出力または出力パラメーター (→ 非 const ポインター)を明確に区別しています (厳密にはcpplint.pyが続きます)。

C/C++ 関数へのパラメーターは、関数への入力、関数からの出力、またはその両方です。通常、入力パラメーターは値または const 参照ですが、出力および入出力パラメーターは非 const ポインターになります。

そしてさらに :

実際、入力引数は値または const 参照であり、出力引数はポインターであるというのは、Google コードの非常に強力な規則です。

しかし、入力/出力引数 (出力引数は脇に置いておきます) を参照渡ししてはならない理由がわかりません。スタックオーバーフローには、この質問に関連するトピックがたくさんあります。たとえば、ここで、受け入れられた回答は明らかに

それは主にスタイルに関するものです

しかし、もし

nullを渡すことができるようにしたい場合は、ポインターを使用する必要があります

では、ポインターが null になるのを避けたい場合、常にポインターを要求するポイントは何ですか? 入力引数に参照のみを使用するのはなぜですか?

4

4 に答える 4

9

彼らが主張していること(私は同意しません)は、私には何らかの機能があると言っているということです

void foo(int a, Bar* b);

引数がオプションの場合b、または場合によっては不要な場合は、次のように関数を呼び出すことができます

foo(5, nullptr);

関数が次のように宣言されている場合

void foo(int a, Bar& b);

次に、 a を渡さない方法はありませんBar

この点 (私のものを強調) は完全に意見に基づくものであり、開発者の裁量に任されています。

実際、入力引数は値または const 参照であり、出力引数はポインターであるというのは、Google コードの非常に強力な規則です。

b出力パラメータにするつもりなら、次のいずれかが完全に有効で合理的です。

void foo(int a, Bar* b);  // The version Google suggests
void foo(int a, Bar& b);  // Reference version, also perfectly fine.
于 2014-10-18T15:17:11.880 に答える
4

あなたは最初の質問です:「それで、ポインターnull.

ポインターを使用すると、変数が変更される可能性があることが呼び出し元に通知されます。を呼び出す場合foo(bar)、 はbar変更されますか? 私が呼び出しfoo(&bar)ている場合、 の値barが変更される可能性があることは明らかです。
オプションの出力パラメータを示すa を受け取る関数の例はたくさんありnullます (頭に浮かんtimeだことが良い例です)。

2 番目の質問: 「なぜ入力引数に参照のみを使用するのですか?」

参照パラメーターを使用する方が、ポインター引数を使用するよりも簡単です。

int foo(const int* input){
    int return = *input;

    while(*input < 100){
        return *= *input;
        (*input)++;
    }
}

参照で書き直されたこのコードは次のようになります。

int foo(const int& input){
    int return = input;

    while(input < 100){
        return *= input;
        input++;
    }
}

const int& inputa を使用するとコードが単純化されることがわかります。

于 2014-10-18T15:52:01.500 に答える
1

出力パラメーターを既存のメモリへの参照 (以前に初期化された変数を変更している) と実際の出力 (出力引数は関数自体によって割り当てられていると見なされる) の両方として使用するため、一貫性のために使用する可能性があります。一貫性を保つために、入力と出力をより明確に示す方法として使用しています。

ルックアップからポインターを返すか、メモリ自体を割り当ててポインターを介して返すなど、出力パラメーターのメモリを割り当てる関数/メソッドがまったく必要ない場合は、参照を使用します。それを行う必要があるが、パラメーターが入力か出力かを示すためにポインターを使用することを気にしない場合は、必要に応じて出力パラメーターの参照を使用します。その関数/メソッド自体の要件で必要でない限り、すべての場合にポインターを使用するという絶対的な要件はありません。

于 2014-10-18T15:27:27.443 に答える