0

関数の引数でのエイリアスの使用に問題があります。これが私の問題です。

この関数の定義を考えてみましょう

void thisIsSparta(int& number){
    ...
}

呼び出し時に、次のコードで完全に機能します。

int king = 1;
thisIsSparta(king);

しかし、これを試してみると、不一致エラーが発生します:

thisIsSparta(1);

エイリアスする変数がないためにエラーが発生していることは簡単に推測できます。したがって、エラーが発生します。ただし、プログラマーが2つのアプローチのいずれか1つだけを使用することを心配する必要はありません。この2番目の関数呼び出しは、問題なく機能するはずです。

私が見る唯一の解決策は、最初の関数に加えて、エイリアス引数のない別の関数を作成することです。

void thisIsSparta(int number){

}

しかし、これはひどいコードの重複をもたらすでしょう、そして私はこれの大ファンではありません。

さらに、変数を使用する場合、プログラムは前者の代わりにこの2番目の定義を使用することを決定できます。次に、変数のコピーを回避することを目的としたエイリアスの興味を失います。

誰かが私の問題の解決策を持っていますか?確かに、これは単純化された例です。実際には、この関数の引数にジェネリック型があり、任意に大きくなる可能性があります。これが、コピーを避けるためにエイリアスを使用したい理由です。

4

3 に答える 3

4

基本タイプの場合は、値を渡すだけです。参照を渡すよりも高速なので、参照を渡すのをやめて、

void thisIsSparta(int number)

大きな型の場合、一時的なもののみを参照にバインドできるconstため、メソッドを次のように宣言できます。

void thisIsSortOfSparta(const MyClass& obj)

関数内の値を変更する場合、引数として一時的なものを渡すことは意味がないため、コンパイラは文句を言うのは正しいですが、そうでない場合は、上記の2つのオプションを使用してください。

于 2013-01-25T14:50:37.223 に答える
2

のようなプリミティブのコピーintは完全に無視できます。いくつかの理由から、参照を渡す方がおそらく費用がかかります。

第二に、あなたはで過負荷にすることができます

const int&
int&

これにより、すべてのintオブジェクトに対して2番目が選択され、一時オブジェクトとconst intオブジェクトに対して1番目が選択されます。

于 2013-01-25T14:51:42.260 に答える
1

引数を参照で渡す際の問題は、関数が引数を変更できることです。

void thisIsSparta(int& number) {
    ++number;
}

さて、何をthisIsSparta(1)しますか?(いいえ、これは定数の変更が可能だった古代のFORTRANではありません...)

変更不可能な変数を渡したい場合、関数は引数を変更しないことを約束する必要があります。

void thisIsSparta(const int& number) {
    // whatever
}

また、他の人が指摘しているように、組み込み型の場合、const参照による受け渡しよりも、値による受け渡しの方が常に望ましいです。

void thisIsSparta(int number) {
    // whatever
}
于 2013-01-25T15:48:08.880 に答える