• 7512阅读
  • 6回复

[提问]想把一个实例变量的引用赋给另外一个实例变量时候遇到的问题 [复制链接]

上一主题 下一主题
离线xyqlgpp
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-10
java写多了,发现不懂C++了··
java里面的假设有个类的实例是A,我用B=A语句的话,改变B里面的实例变量的值,A对应的实例变量的值也会改变,就是说A B实质都是指向同一块内存的(我就是想要这个效果)

C++里面,用引用的话应该能达到相同的效果吧,但是那个结果出乎我意料:
代码这样的时候:
    QList<int> list_1;
    list_1<<1<<2<<3;
    qDebug()<<list_1;
    QList<int> list_2;
    list_2 = list_1;
    list_2<<4;
    qDebug()<<list_2;
    qDebug()<<list_1;
输出时:
(1, 2, 3)
(1, 2, 3, 4)
(1, 2, 3)
也就是说list_1跟list_2不是指向同一块内存的,但是Qt文档里面对于QList的=的说明是:
QList<T> & QList::operator= ( const QList<T> & other )
Assigns other to this list and returns a reference to this list.
就是返回引用啊···那么为什么我改变引用的值,本体不会跟着改变呢···无法理解。


ps:
如果代码改成这样:
    QList<int> list_1;
    list_1<<1<<2<<3;
    qDebug()<<list_1;
    QList<int> *list_2;
    list_2 = &list_1;
    *list_2<<4;
    qDebug()<<*list_2;
    qDebug()<<list_1;
输出就变成:
(1, 2, 3)
(1, 2, 3, 4)
(1, 2, 3, 4)
也就是list_1跟list_2指向同一块内存了,但是这样写··好不美观啊····
离线interlc

只看该作者 1楼 发表于: 2011-04-10
文档中不是讲Assigns other,就应该是另外一个吧,重新开了个内存
而不仅仅是指向原内存的指针
我是这样理解的
离线wxj120bw

只看该作者 2楼 发表于: 2011-04-10
楼上的分析是对  c++的运算符重载和对象的指针
离线dbzhang800

只看该作者 3楼 发表于: 2011-04-10
引用楼主xyqlgpp于2011-04-10 21:05发表的 想把一个实例变量的引用赋给另外一个实例变量时候遇到的问题 :
C++里面,用引用的话应该能达到相同的效果吧,但是那个结果出乎我意料:
代码这样的时候:
    QList<int> list_1;
    list_1<<1<<2<<3;
    qDebug()<<list_1;
    QList<int> list_2;
    list_2 = list_1;

    list_2<<4;
    qDebug()<<list_2;
    qDebug()<<list_1;
.......


改成:
  1.      QList<int> &list_2 = list_1;
离线lishi108
只看该作者 4楼 发表于: 2011-04-10
回 楼主(xyqlgpp) 的帖子
好像记得是第一次定义了list_2后list_2 = &list_1;初始化list_2是浅拷贝,但当再一次对list_2值改变时,list_2会先深拷贝一次list_1,然后再改变值,可以看看浅拷贝和深拷贝那块哈

离线sbtree
只看该作者 5楼 发表于: 2011-04-11
这个还是得回到C++去,看一看声明变量,声明指针变量以及声明引用变量的区别
windows 7 + VC++2008 + Qt4.5.2
离线roywillow

只看该作者 6楼 发表于: 2011-04-11
我想它那句想表达的意思可能是告诉你你可以连续赋值,也就是连等大概
qt好像是隐式共享,只有在改变其中一个变量的时候才会真正进行深层拷贝
你可以给第二个列表声明为一个QList&而不是QList*,这样应该可以吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个