私はいくつかのオープンソースコードを調べており、次のように定義されたクラスにいくつかの奇妙なインスタンスをリストしました:
Obj *&obj;
それが可能だとは思いもしませんでした!それはどういう意味ですか?私の意見では、ポインターと参照記号は相殺する必要があります。しかし、私が知らない何か特別なことをしているのかもしれません。
コードを見ると、インスタンスがポインターであるかのように使用されます。すなわち: obj->method()
. では、なぜ彼らは を含めたの&
ですか?
私はいくつかのオープンソースコードを調べており、次のように定義されたクラスにいくつかの奇妙なインスタンスをリストしました:
Obj *&obj;
それが可能だとは思いもしませんでした!それはどういう意味ですか?私の意見では、ポインターと参照記号は相殺する必要があります。しかし、私が知らない何か特別なことをしているのかもしれません。
コードを見ると、インスタンスがポインターであるかのように使用されます。すなわち: obj->method()
. では、なぜ彼らは を含めたの&
ですか?
あなたが書いたようなコードは、ポインターへの参照を宣言しているためコンパイルされませんが、参照は初期化されていません。たとえば、次のコードはコンパイルされません。
string *&s;
(クラスのメンバーでない限り)、これは次のようになります。
string *p;
string *&s = p;
もう1つの可能性は、これは単なるタイプミスであり、彼らが書くつもりだったということObj *obj;
です;)
それはポインタへの参照です。次のように考えてください。
A *pa = new A(); //pa is pointer to A
A * & rpa = pa; //rpa is reference to pa
rpa = nullptr; //it modifies pa as well
if ( pa == nullptr )
{
std::cout << "pa is nullptr" << std::endl;
}
コンソールに「pa is nullptr」と表示されます。
A * &
読みにくい場合は、次のように typedef を使用できます。
typedef A* PA;
PA & rpa = pa; //same as before
これはポインタへの参照です。結局のところ、ポインタも値です。これを使用して、呼び出し元が保持しているポインターを再割り当てできます。説明する:
bool allocate(t_object*& p) {
assert(0 == p);
p = new t_object;
...
}
それで:
t_object* obj(0);
if (!allocate(obj)) {...}
// obj now points to something
一部の人々は、その最も直接的な代替手段()を管理/読み取る方が簡単だと感じていますbool allocate(t_object** p)
。
プログラムでポインタへの参照が選択された理由については、十分なコンテキストがありませんが、メンバーが宣言された場合にプログラムが優れt_object** const
ているかどうかを自問することができますか?
ポインタへの参照です。ポインターはデータ型ですが、ポインターへの参照を許可しないのはなぜですか?
これは、他の型参照と同じことを意味します。つまり、ポインターのエイリアスです。