值型別
是複製,是實體
.
引用型別
是鑰匙
.我覺得,為啥不用&
表引用呢?太奇怪了.
引用變數就像鑰匙
,不是實體
.但能夠訪問.
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之類的型別都屬...