隐式转换和显式转换的区别

前言:

转载请附上连接,本帖原创请勿照抄。

文章开头先引用一个概念,隐式转换,那么隐式转换和显式转换的区别:

    例如,一个int类型的变量转换QString的时候,QStringList qStrList;  QString qStr=qStrList;  直接就可以转换中间不需要通过其他转换直接就可以实现功能。

    比如一个Byet需要转换为QString的时候,可能要转换成其他类型的变量再转才能转换为QString,这就是显式转换。

    这只是举个例子,转换方式不对请勿介意看看就好,就是说一个概念。隐式转换将过程屏蔽了直接就可以转换,显式则需要自己一步一步转换。

Qt中许多常用的类都使用了隐式共享技术,如QString、QImage、容器类、绘图相关类等等。

 	
QString str1 = "ubuntu";
QString str2 = str1;        //str2 = "ubuntu"
str2[2] = "m";              //str2 = "ubmntu",str1 = "ubuntu"
str2[0] = "o";              //str2 = "obmntu",str1 = "ubuntu"
str1 = str2;                //str1 = "obmntu",

解释:

line1: 初始化一个内容为"ubuntu"的字符串;
line2: 将字符串对象str1赋值给另外一个字符串str2(由QString的拷贝构造函数完成str2的初始化)。
在对str2赋值的时候,会发生一次浅拷贝,导致两个QString对象都会指向同一个数据结构。该数据结构除了保存字符串“ubuntu”之外,还保存一个引用计数器,用来记录字符串数据的引用次数。此处,str1和str2都指向同一数据结构,所以此时引用计数器的值为2.
line3: 对str2做修改,将会导致一次深拷贝,使得对象str2指向一个新的、不同于str1所指的数据结构(该数据结构中引用计数器值为1,只有str2是指向该结构的),同时修改原来的、str1所指向的数据结构,设置它的引用计数器值为1(此时只有str1对象指向该结构);并在这个str2所指向的、新的数据结构上完成数据的修改。引用计数为1就意味着该数据没有被共享。
line4: 进一步对str2做修改,不过不会引起任何形式的拷贝,因为str2所指向的数据结构没有被共享。
line5: 将str2赋给str1.此时,str1修改它指向的数据结构的引用计数器的值位0,表示没有QString类的对象再使用这个数据结构了;因此str1指向的数据结构将会从从内存中释放掉;这一步操作的结构是QString对象str1和str2都指向了字符串为“obmntu”的数据结构,该结构的引用计数为2。

猜你喜欢

转载自blog.csdn.net/qq_37529913/article/details/110249725