C 學習筆記(二)方法之定義(記憶體堆疊)

2021-10-22 23:15:17 字數 2305 閱讀 4288

定義乙個student類。

class student

在main()中呼叫。

這對括號就是在呼叫student 例項 的構造器

但是我們的類定義時:沒有構造器。編譯器會自動準備乙個預設的構造器

如何判斷預設的構造器執行了?我們列印欄位的值。預設建構函式會對字段初始化構造。從記憶體中直接刷0。預設構造器的作用。

如果我們想給字段初始化值,不想讓預設構造器賦值,那麼就需要自己寫自定義構造器。

vs中在類內:輸入:ctor。按兩次tab鍵,即可完成構造器結構。

class student

}

需求來了:有時候為了防止我們在宣告學生之後,忘了給他編號,忘了給他學號id賦值。學生必須有學號id。所以需要強制使用者在建立例項的時候必須要輸入id。

此時就需要乙個帶引數的建構函式。

class student

public student()

}

class program

}class student

}

先來看看無參構造例項化物件在記憶體中的操作。

id是int型別,結構體型別,在記憶體中佔4個位元組。name是string,是類型別,是引用型別,引用型別的變數佔4個位元組,裡面儲存的是:例項的位址。

首先給區域性變數stu分配位址。stu是區域性變數,分配在棧中。從棧中,分配4個位元組給student引用變數,棧記憶體位址在分配的時候,是從高位址往低位址分配,直到分配到棧頂為止,就溢位了。

1、分配:stu在棧中分配完之後,要等到new student為建立物件分配空間,new student在建立物件時,從堆中找可用空間,分配給例項。此時分析例項需要多大空間。發現類中有乙個int欄位,乙個string欄位。都是占用4個位元組。總共八個位元組空間,將8個位元組分配給student例項。

2、構造:分配給例項之後,此時呼叫構造器()。構造器將分配的空間分割成兩部分,一部分是int型別欄位id的4位元組,一部分是string型別欄位name的4位元組。

3、初始化:上面提及的【預設構造器】:沒有給任何引數,堆中預設刷為0,如果是int型別,那麼預設就是0,如果是string型別,那麼預設就是null。

再來看看帶參構造例項化物件在記憶體中的操作:二次堆中開闢空間。兩次記憶體轉儲。

class program

}class student

public student()

}

同上面無參構造相似,不同點在於:我們使用【自定義構造器】帶引數,不再採用【預設構造器】。

(1,"mr.okey")帶引數構造器。

欄位id是int型別,直接將初始化值1在堆中轉為二進位制儲存,注意是從高位址到低位址排。最上面代表最低位置。

欄位name是string型別,因此是引用型別,不能在儲存欄位的位置儲存,在堆中重新開闢空間儲存欄位的值。欄位name中儲存值mr.okey的(引用位置)起始位置。

因此引用型別中的引用,二級引用相當於二級指標。

C 學習筆記(三) 方法

方法 由方法頭和方法體兩部分構成,方法頭包括返回型別 方法名 引數列表 方法體是乙個由花括號括起來的語句塊。方法體可以包含本地變數 控制流結構 方法呼叫和內嵌的塊。本地變數 儲存本地或者臨時的計算資料,而字段儲存與物件狀態有關的資料。本地變數的存在性與生存期僅限於建立它的塊以及內嵌的塊,它從宣告開始...

ruby學習筆記 7 方法

定義方法 def method puts method end 呼叫時可以帶或不帶 均可 method method method method 使用引數 def methoduseargs arg1,arg2 print arg1,arg2 end 呼叫時可以帶或不帶 均可 methodusear...

Java學習筆記(10) 方法

方法 什麼是方法 乙個演算法邏輯功能的封裝,是一般完成乙個業務功能,如 登陸系統,建立聯絡人,簡單說 方法是動作,是動詞。方法名 一般按照方法實現的功能定名,一般使用動詞定義,如 login createcontact createanswer 方法引數 是方法的前提條件,是方法執行依據,是資料,如...