2

ポインタを使用する理由に関するディスカッションを読んでいました。そして、ポインターを使用する理由の 1 つは、「参照によって変数を関数に渡す方法がなかった場合」であると述べた Tooony(ほとんどの投票) による回答に出くわしました。

参照によって変数を渡すことができない場合、どのような場合が考えられますか?

参照渡しができない状況は他にありますか?

私を啓発してください、私はどんな状況も考えられません

ありがとう

4

2 に答える 2

3

あなたが尋ねる、

「参照によって変数を渡すことができない場合、考えられるケースは何ですか?」

C ++ 11には、そのような2つの主なケースがあります(おそらく、私が考えもしなかったいくつかのケースがあります)。

  • 関数宣言をC言語バインディングにも使用する場合。

  • オブジェクトが未知の境界の配列である場合。

後者の場合、おそらく配列の最初の項目への参照を渡すことができますが、関数内では、コードは配列性を取り戻すためにアドレスを取得する必要があり、正式な型は単にこのように非現実的ですが、非常に誤解を招く可能性もあります。

また、驚いたことに、Visual C ++ 11.0(Visual Studio 2012に付属のコンパイラ)は次のようにコンパイルします。

#include <iostream>
using namespace std;

void foo( int const (&a)[] )
{
    for( auto p = &a[0]; *p != 0; ++p )
    {
        wcout << *p << endl;
    }
}

extern int const data[];

int main( int argc )
{
    foo( data );
}

int const data[] = {1, 2, 3, 4, 5, 0};

ただし、MinGW g ++ 4.7.1は、当然のことながらそれを拒否します。


C ++ 03には存在したが、C ++ 11には存在しなくなったケースのひとつは、C ++ 03では、参照に渡される一時オブジェクトにconstアクセス可能なコピーコンストラクターが必要だったというものです。これは、C ++ 03では、コンパイラーが任意の数のコピーを作成できるためです。C ++ 11では、可​​能な場合は参照を直接バインドする必要があります。


綿密な調査で非ケースとなる1つのケースは、nullpointerのように「オブジェクトを参照しない」可能性を表現する必要がある場合です。

例えば、

void foo( int const* pValue = 0 ) { if( pValue != 0 ) { ... } }

ただし、オーバーロードを含む回避策がありますfoo

void foo( int const& value ) { ... }
void foo() {}
于 2012-12-19T02:01:43.743 に答える
2

参照は、初期化されたメモリを指す必要があります。つまり、NULL. 関数内のオブジェクトを参照しないパラメーターを許可する場合は、ポインターを使用する必要があります。

ただし、次のように書かれている内容を読み間違えているようです。

C では、文字列などの複雑なデータ型はサポートされていません。変数を「参照によって」関数に渡す方法もありません。

具体的には、 Cには参照などの概念はありません。したがって、ポインターを使用する必要があります。ただし、C++ では、関数の引数リストでポインターを使用できる場所で、参照を使用できない場所は事実上ありません。

于 2012-12-19T01:41:04.083 に答える