27

重複の可能性:
C++: 参照とポインターを使用する
場合

どうしようもありませんでしたが、この根本的な疑問が頭に浮かびました。ポインターでも同じようにできるのに、なぜ C++ には参照があるのですか?

特定の状況で少し安全で、多くの場合、コードがきれいになることは知っていますが、技術的には違いはありませんよね? では、ポインターを使用できず、参照が必須である状況はありますか? やむを得ず参照を使用する場合の具体
例 を見てみたい。

免責事項:
StackOverflow でこれに対する回答は見つかりませんでした。これは構文の違いに関する質問ではありません。そもそもなぜ C++ 言語で参照が導入されたのか疑問に思っています。

4

5 に答える 5

10
  • ポインターだけを使用すると、正しくpass-by-referenceまたはreturn-by-reference.
  • 一部のメソッドには参照が必要です。コピーコンストラクターをどのように実装しますか?
  • エイリアシングを強制する必要がある場合があります。ポインターではそれを行うことはできません-それらは変更できます。参照は別のものにバインドできません。したがって、参照を初期化すると、スコープを通じて同じオブジェクトを参照することが保証されます。
  • 安全性の問題
  • ( const)参照は一時オブジェクトにバインドできます。一時ポインタを作成するには、渡すメソッド内で解放する必要があります。しかし、それが一時的なものなのか、内部にないものなのかはわかりません。
于 2012-05-28T08:44:50.463 に答える
8

演算子のオーバーロード。「参照を介して渡す」ためにポインタを使用すると、受け入れられない構文になります。

于 2012-05-28T08:44:40.073 に答える
3

パラメーターとしてポインターがある場合は、NULL かどうかを確認する必要があります。参照では、そのチェックを行う必要があります。これが、男性自身からのC++での参照がある理由です- http://www.stroustrup.com/bs_faq2.html#pointers-and-references

于 2012-05-28T08:54:28.977 に答える
1
class A{
public:
    A(int i){}
};

void foo(const A& a){};
void foo2(const A* pa){};
int main (void)
{
  foo(1);
  foo2(1); //invalid
  return (0);
}

私が知っている1つのケース.ユーザーは参照オブジェクトを管理する必要はなく、コンパイラーはそれを破棄できます。ポインターでは、ユーザーがそれを明示的に削除する必要があるためです。foo2 の場合、一時的なライフサイクルを管理するのは困難です。

于 2012-05-28T08:48:15.130 に答える
0

例:

my_type *get_some_data();
...
my_type *data = get_some_data();

delete dataしながら行うことができます

my_type &get_some_data();
...
my_type &data = get_some_data();

削除する方法はありません。

于 2012-05-28T08:46:39.840 に答える