ポインタとリファレンスの問題

1099 ワード

int main()  
{  
Tree tree;  
tree.Add(5);  
}  
class Tree  
{  
public:  
Tree(Node* root=NULL);  
void Add(int data);  
private:  
Node root;  
void add(Node* root,Node *node);  
}  
Tree::Tree(Node* root)  
{  
this->root = root;  
}  
void Tree::add(Node *root,Node *node)  
{  
if(root == NULL)  
root = node;  
else  
……  
}  
void Tree::Add(int data)  
{  
add(this->root,new Node(data));  
}  

ここでは所定の目標を達成することはできないが,addメソッドを初めて実行した後もthis->rootの値はNULLであり,我々が想像していたnodeを指すものではない.このような状況はadd法のパラメータ伝達問題にある.もちろん、addメソッドではポインタが渡され、ポインタが同じメモリ領域を操作すると、addメソッドではシェイプパラメータrootの操作がthis->rootに反映されると考えられます.図のように
addメソッド呼び出しで、this->rootをシェイプrootにコピーします.これにより、this->rootとシェイプrootは同じメモリ領域を指し、nodeオブジェクトに対する操作によって他方が同じ結果を得ることができますが、シェイプrootとthis->rootは同じメモリ領域ではなく、シェイプrootに値を割り当て、this->rootも同じ空間を指すことはありません. 
我々が望む結果を達成するために、addのメソッドヘッダを以下のように変更するだけでよい:void add(Node*&root,Node*node)は、このように形参rootがthis->rootの参照として存在し、図のように機能する.
これは,ポインタがパラメータとして伝達される際に特に注意すべき点である.変数自体を変更するには、変数の参照を渡す必要があります.ポインタは、指すメモリ領域の内容しか変更できません.