0

参照にコンパイル時の型チェックがないのに、なぜポインターではなく参照を使用するのですか?

(かなりランダムな)Person参照/ポインターを保持する必要があるタイプのオブジェクトを作成していると想像してください。そのため、personオブジェクトはデータメンバーとして家の参照/ポインターを保持します。Houseこれが参照で行われたと想像してください:

class Person{
   public:
      Person(House& myHouse) : house(myHouse) { }
   private:
      House& house;
};

私が見る問題は、データメンバー宣言に&を含めるのを忘れた場合、参照だと思ったものがコピーになるということです。確かに、ポインタを渡して保存する方が安全なので、コンパイル時にこのエラーが報告されますか?

私はどちらか一方を使用することを主張していません-データメンバーを保存するためにポインター上で参照が使用されるのはなぜですか?

4

2 に答える 2

0

私はどちらか一方を使用することを主張していません-データメンバーを保存するためにポインターよりも参照が使用されるのはなぜですか?

ポインターと参照の両方がデータ メンバーとして使用されます。参照T&は不変のポインターと同じくらい柔軟T* constです。さらに、参照は null ではない場合があります。したがって、これらのプロパティが必要なものを最良の方法で説明している場合は、参照を使用してください。

IOW、すべてにPersonが必要で、Houseの存続期間中Personに他のものに切り替えられない場合は、参照を使用します。どうやら両方の前提がばかげているように感じるので、実際にはポインターの方が優れている可能性があります。HousePerson

ポインターが常に優れているとは限りません。物事が不変のままである場合は、可変性 ( ) よりも不変性 ( int* const) を優先します。int*物事が確実な場合は、不確実性 (1 つまたはゼロ) よりも確実性 (1 つだけ) を優先します。

OOP では、コンポーネント オブジェクトの構成関係は通常、複合オブジェクトへの参照として行われます。コンポーネントはコンポジットなしでは存在できず、他のコンポジットのコンポーネントになることはできないため、参照が最適です。

于 2013-02-23T21:42:43.493 に答える
0

データ メンバー宣言に & を含めるのを忘れた場合、参照だと思っていたものがコピーになります... ポインターを渡して保存する方が安全なので、このエラーはコンパイル時にフラグが立てられますか?

メンバーを宣言するときに署名を入力するのを忘れることはできません。&あなたが書くHouse& houseHouse house、あなたの決定であるかにかかわらず、そのコンパイラは尊重する必要があります。オブジェクトへの参照の宣言を変更するときは、意図的に行います。これは、コンパイラが警告するべきものではありません。

値渡しか参照渡しかをコンパイラが知る方法はありません。ポインターによる受け渡しを値による受け渡しに変更すると、コンパイラーがエラーを報告するのは、コピー (自動記憶域期間を持つオブジェクト) をポインター (構文的に正しくない) として扱うからであり、認識できるからではありません。おそらくポインタで渡すことを意味していました。

データ メンバを保存するためにポインタよりも参照が使用されるのはなぜですか?

主な理由は、参照が常に既存のオブジェクトで初期化されるようにすることです。これNULLは、実行時ではなくコンパイル時にエラー処理をチェックせず、潜在的なエラーをキャッチすることも意味します。他の議論はよりクリーンなコード (読みやすさ) かもしれません。私の意見では、参照を使用すると、醜いメモリ管理とメモリ リークのダンジョンに入るのではなく、自動保存期間を持つオブジェクトに依存し、RAIIイディオムに従うことを学ぶようになります。

しかし、この質問に対処する多くの既存の質問が見つかると確信しています。たとえば、ポインタと参照

于 2013-02-23T21:29:54.740 に答える