13用d程式設計值與引用型別

2021-10-03 09:09:39 字數 2278 閱讀 7929

值型別是複製,是實體.

引用型別鑰匙.我覺得,為啥不用&表引用呢?太奇怪了.

引用變數就像鑰匙,不是實體.但能夠訪問.

d中類是引用型別.複製乙個類變數時,你得到一把鑰匙.改變後面鑰匙的值,前面的實體也改變了.除非你又分配了個新實體.

同樣,分配關聯陣列時,也是一樣,就像單例一樣,除非你新分配乙個實體,你其實複製的是一把鑰匙.

auto variable =

new myclass;

variable.member =1;

auto variable2 = variable;

//還是那個

variable2.member =2;

assert

(variable.member ==2)

;//原來那個改了

//-----

string[

int] byname =[1

:"one",10

:"ten"

,100

:"hundred",]

; string[

int] byname2 = byname;

//得到新鑰匙

byname2[4]

="four"

;//改了.

assert

(byname[4]

=="four");

//原來的實體也改了

只不過你複製的鑰匙很強大.你可以按需修改.

切片,有兩種型別,一種是鑰匙,一種是實體.有的切片就是鑰匙,複製得到一把鑰匙後,就開始幹活了.

int

slice1 =[10

,11,12

,13,14

];int[

] slice2 =[20

,21,22

];int[

] slice3 = slice1[1.

.3];

//幹壞事的鑰匙,破壞1切片

slice3[0]

=777

;assert

(slice1 ==[10

,777,12

,13,14

]); slice3 = slice2[$ -1.

. $]

;//幹壞事的鑰匙,破壞2切片

slice3[0]

=888

;assert

(slice2 ==[20

,21,888])

;//同樣的,搞破壞.

auto variable1 =

new myclass;

variable1.member =1;

auto variable2 =

new myclass;

variable2.member =2;

auto acopy = variable1;

acopy.member =3;

acopy = variable2;

acopy.member =4;

assert

(variable1.member ==3)

;assert

(variable2.member ==4)

;

這樣:

myclass variable;,為無效的空引用.此時還未建立這個類.是個空指標

固定長度陣列值型別,切片是引用型別(有鑰匙/實體之分).

int[3

] array1 =[10

,20,30

];auto array2 = array1;

//複製實體,

array2[0]

=11;assert

(array1[0]

==10);

//未受影響

模組變數,全模組都能訪問的全域性變數.在所有函式外.

引用型別可為無效,即一把還未說明指向誰的鑰匙.

值型別與引用型別

直白點兒說 值型別就是現金,要用直接用 引用型別是存摺,要用還得先去銀行取現。麥機長 我覺得這話十分形象。宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址...

值型別與引用型別

工作許久了,可是對c 中的值型別和引用型別卻一直無法很好的理解。這兩天花了不少時間查詢資料,看文章,終於有所收穫,在此將自己理解整理出來,方便日後自己檢視,同時希望對跟我有一樣困惑的朋友有所幫助。廢話不多說,下面開始說說怎麼理解值型別和引用型別!值型別資料直接在他自身分配到的記憶體中儲存資料,而引用...

值型別與引用型別

自動變數型別是指儲存於該程式 程序 堆疊空間的一種變數型別 注意此時的堆疊空間並不是組合語言上的堆疊,只是它的使用及釋放類似於堆疊的過程 這個變數型別的乙個特點是它在程式執行時存在,在程式結束時消失。正是這個過程類似於彙編裡棧的操作,所以才將其命名 處理 為堆疊。我們平時所定義的int之類的型別都屬...