[解決済み] メンバーデータにはポインタとリファレンスのどちらを使うべきですか?
2022-05-06 19:20:30
質問
これは、質問を説明するための簡略化された例です。
class A {};
class B
{
B(A& a) : a(a) {}
A& a;
};
class C
{
C() : b(a) {}
A a;
B b;
};
このコードをlintにかけたところ、参照メンバについて警告が出ました。 lint#1725 . しかし、デフォルトのコピーと代入は、ポインターについても同様で、ほとんど利点がありません。
裸のポインターは、そのポインターを削除する責任が誰にあるのかが不明確になるので、私は常に、できる限り参照を使用するようにしています。 私はオブジェクトを値で埋め込むことを好みますが、ポインタが必要な場合は、ポインタを所有するクラスのメンバーデータでauto_ptrを使用し、オブジェクトを参照として渡しています。
一般的に、メンバーデータでポインターを使用するのは、ポインターがNULLになる可能性がある場合や、変更される可能性がある場合に限られますね。 データ・メンバに参照ではなくポインタを使用する他の理由はありますか?
参照は一度初期化されると変更できないはずなので、参照を含むオブジェクトは割り当て可能であってはならないというのは本当でしょうか?
どのように解決するのですか?
参照メンバは、クラスの実装ができることを制限し(あなたが言うように、代入演算子の実装を阻止することを含む)、クラスが提供できることに何のメリットももたらさないので、避けてください。
問題例です。
- を使用すると、各コンストラクタの初期化リストで参照を初期化することを余儀なくされます。この初期化を別の関数 ( C++0xまでは、とにかく を編集してください。 C++は現在 委譲コンストラクタ )
- 参照はリバウンドしたり、NULLにすることはできません。これは利点でもありますが、もしコードを変更して再バインドを可能にしたり、メンバーをNULLにしたりする必要がある場合は、そのメンバーのすべての使用方法を変更する必要があります。
- ポインタ・メンバとは異なり、リファレンスはスマート・ポインタやイテレータに簡単に置き換えることができないので、リファクタリングで必要になるかもしれません。
-
参照が使用されるときはいつでも、値型(
.
演算子など)、しかしポインタのようにふるまう(ぶら下がることができる) - だから例えば Googleスタイルガイド を推奨しています。
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] リファレンスとポインタの使い分け
-
[解決済み] C++のクラスメンバは、明示的に初期化しない場合、どのように初期化されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】'std::cout'への未定義の参照