隱式轉換和顯式轉換的區別

2021-10-10 22:34:11 字數 1353 閱讀 6249

前言:

例如,乙個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。

隱式轉換 vs 顯式轉換

js資料型別分為兩種 基本資料型別 原始型別 引用資料型別 物件型別 基本資料型別 number string boolean undefined null symbol es6新出 引用資料型別 object 物件型別 其中涉及最多的隱式轉換的運算子是 和 運算子 1 如果 的一端是string型...

顯式型別轉換和隱式型別轉換

typeof六種資料型別 number string boolean undefined object function var num 123 console.log typeof num number var num1 true console.log typeof num1 string va...

C 隱式轉換與顯式轉換

普通型別的轉換順序 隱式把char int和從short double。轉換可能會導致資料的丟失。自定義型別 有兩種函式可以進行隱式轉換,單引數建構函式 和 隱式型別轉換符。自定義型別可以用函式前 explicit 關鍵字,防止轉換。單個引數的建構函式,或可傳單個引數的類建構函式 example 1...