Mark Allen Weissのデータ構造に関する本の中で、次のコードが出てきました。定数参照ラッパー
template <class Object>
class Cref
{
public:
Cref () : obj (NULL) { }
explicit Cref(const Object & x) : obj (&x) {
const Object & get() const
{
if (isNull())
throw NullPointerException() ;
else
return *obj;
}
bool isNull() const
(return obj == NULL; }
private:
const Object *obj;
};
ここでのポイントは、定数参照をnull /初期化することです。しかし、私は以下を理解しているかどうかわかりません: 1.別の定数参照を使って定数参照を初期化します。しかし、なぜそれがobj(& x)として再び行われますか? constオブジェクト& xの&はobj(& x)の& xとは異なりますか?私はこれを見るが、それがなぜそうであるべきか明確ではない。 Plsは説明します。 2. getメソッド() - このクラスのprivateメンバーobjのconst参照を返そうとします。これはすでにconst参照です。 * objを返すのはなぜ?objだけではないのですか? 3.なぜ明示的なキーワードですか?暗黙の型変換が行われるとどうなりますか?誰かがこのためのシナリオを提供することはできますか?
おかげ
説明をありがとう!特に#2! :) – svk
#1についても、これは宣言の問題であることを意味します。実際にポインタに代入するときはconstオブジェクト& x;のようなconst参照しか宣言できないので、ptr =&xが実行されることは避けられません。私の理由は正しいのですか? – svk
@SuprajaJayakumar:論理的な観点から、リファレンスは基本的にオブジェクトの名前を付けます。つまり、コンストラクタ内で渡されたオブジェクトには 'x'という名前が付いています(const参照であるためconstです)。したがって、 'x'はその型の変数を使うのとまったく同じです。変数へのポインタを得るには、addess-of演算子 '&'を使います。したがって、 'x'と同じことをします。リファレンスがシンボル '&'を使って定義されているという事実は、これと論理的には無関係です。そのためにキーワード 'ref'を使うことに決めたのであれば、同じだったでしょう。 – celtschk