成员函数摘引与非引用的区别。

成员函数引用与非引用的区别。。
我编写了一个类,私有成员为四个类型的指针 容器,有四个成员函数是调用这些容器
C/C++ code

pubic:
  //构造函数其他神马的略
  vector <T1 *> GetTT1()
  {return TT1;}
  vector <T2 *> GetTT2()
  {return TT2;}
  vector <T3 *> GetTT3()
  {return TT3;}
  vector <T4 *> GetTT4()
  {return TT4;}
private:
  vector <T1 *> TT1;
  vector <T2 *> TT2;
  vector <T3 *> TT3;
  vector <T4 *> TT4;




好了。。
再定义 这个类的一个 实例 X
当我用 iterator 迭代器 

C/C++ code

for(vector<T1 *>::iterator it =X.GetTT1().begin(); it !=X.GetTT1().end();++it


运行到这一句,程序崩了,提示信息Expression: vector iterator incompatible.. 迭代器矛盾 - -!.

然后把成员函数改成引用
C/C++ code

  vector <T1 *> &GetTT1()
  {return TT1;}
  vector <T2 *> &GetTT2()
  {return TT2;}
  vector <T3 *> &GetTT3()
  {return TT3;}
  vector <T4 *> &GetTT4()
  {return TT4;}


一切就OK了。。




求大神 解释!!!!!!!!!!!!!!!!!!!!!!!!!!!

------解决方案--------------------
非引用函数返回的是一个副本。这点要明白。下面分析:
iterator it =X.GetTT1().begin();这时候假设X.GetTT1返回的是一个临时对象A。而你的迭代器指向了A的开始。
it !=X.GetTT1().end()这时候X.GetTT1返回的临时对象B,你把A的迭代器和B的迭代器进行比较。崩溃了......
而返回的引用的问题是:返回的都是同一个。明白没??
------解决方案--------------------
1、2楼的解释都很到位。