程式設計課堂筆記

2021-09-12 08:06:55 字數 4131 閱讀 1473

2019.3.2

1.淺拷貝: 將原物件或原陣列的引用直接賦給新物件,新陣列,新物件/陣列只是原物件的乙個引用。

2.深拷貝: 建立乙個新的物件和陣列,將原物件的各項屬性的「值」(陣列的所有元素)拷貝過來,是「值」而不是「引用」。

當我們希望在改變新的陣列(物件)的時候,不改變原陣列(物件),則使用深拷貝。

如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝。在某些狀況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是把物件裡的值完全複製給另乙個物件,如a=b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那a中的那個成員變數也指向同一塊記憶體。這就出現了問題:當b把記憶體釋放了(如:析構),這時a內的指標就是野指標了,出現執行錯誤。

自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。

2019.3.9

區域性變數

靜態區域性變數

靜態全域性變數

靜態成員變數

全域性變數

區域性變數:指在程式中只在特定過程或函式中可以訪問的變數。

靜態區域性變數:靜態區域性變數也是定義在函式內部的,靜態區域性變數定義時前面要加static關鍵字來標識,靜態區域性變數所在的函式在多呼叫多次時,只有第一次才經歷變數定義和初始化,以後多次在呼叫時不再定義和初始化,而是維持之前上一次呼叫時執行後這個變數的值。本次接著來使用。

靜態全域性變數:用來解決重名問題。靜態全域性變數定義時在定義前加static關鍵字, 告訴編譯器這個變數只在當前本檔案內使用,在別的檔案中絕對不會使用。

全域性變數:定義在函式外的變數,同一工程內的各個檔案都可使用,在非定義檔案中使用前,要先用extern關鍵字再次宣告這個全域性變數。

靜態成員變數:靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用"類名.靜態成員名"訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員函式不能訪問非靜態的成員..因為靜態成員存在於記憶體,所以非靜態成員函式可以直接訪問類中靜態的成員。

從分配記憶體空間看:

全域性變數、靜態區域性變數、靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧分配空間。

全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上沒有什麼不同。區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其他原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其他原始檔中引起錯誤。

靜態變數與非靜態變數對比:

(1)靜態變數會被放在程式的靜態資料儲存區里,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是他與堆疊變數和堆變數的區別,單例模式就是利用這個機制。

(2)變數用static告知編譯器,自己僅僅在變數的作用域範圍內可見。這一點是靜態變數與全域性變數的區別。

從以上分析可以看出,把區域性變數改變為靜態變數後是改變了他的儲存方式,即改變了他的生存期。把全域性變數改變為靜態變數後是改變了他的作用域,限制了他的使用範圍,

因此static這個說明符在不同的地方起的作用是不同的。

區域性變數和全域性變數對比:

(1)定義同時沒有初始化,則區域性變數的值是隨機的,而全域性變數的值是預設為0.

(2)使用範圍上:全域性變數具有檔案作用域,而區域性變數只有**塊作用域。

(3)生命週期上:全域性變數是在程式開始執行之前的初始化階段就誕生,到整個程式結束退出的時候才死亡;而區域性變數在進入區域性變數所在的**塊時誕生,在該**塊退出的時候死亡。

(4)變數分配位置:全域性變數分配在資料段上,而區域性變數分配在棧上。

(1)傳位址(用指標)

(2)引用

(3)返回值

void main()

void change_variable_value(int variable)

工程:function

棧:是一種連續儲存的資料結構,具有先進後出的性質。通常的操作有入棧(圧棧)、出棧和棧頂元素。想要讀取棧中的某個元素,就要將其之前的所有元素出棧才能完成。

堆:是一種非連續的樹形儲存資料結構,每個節點有乙個值,整棵樹是經過排序的。特點是根結點的值最小(或最大),且根結點的兩個子樹也是乙個堆。常用來實現優先佇列,訪問隨意。

棧記憶體:由程式自動向作業系統申請分配以及**,速度快,使用方便,但程式設計師無法控制。若分配失敗,則提示棧溢位錯誤。注意,const區域性變數也儲存在棧區內,棧區向位址減小的方向增長。

堆記憶體:程式設計師向作業系統申請一塊記憶體,當系統收到程式的申請時,會遍歷乙個記錄空閒記憶體位址的鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。分配的速度較慢,位址不連續,容易碎片化。此外,由程式設計師申請,同時也必須由程式設計師負責銷毀,否則則導致記憶體洩露。

從作用域看:

全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。其他不包括全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。

靜態區域性變數具有區域性作用域。它只被初始化一次,自從第一次初始化直到程式結束都一直存在,即它的生命週期是程式執行就存在,程式結束就結束,和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。也就是在別的函式訪問這個變數是錯誤的。

區域性變數也只有區域性作用域,他是自動物件,他在程式執行期間不是一直存在,而是只在函式執行期間存在,函式的一次呼叫結束後,變數就被撤銷,其所占用的記憶體也被收回。生命週期在函式結束後就結束了,作用域也僅限於該函式。

靜態成員變數:靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名+靜態成員名訪問此靜態成員,因為靜態成員先於類的宣告而存在於記憶體,也可以根據類宣告的物件來訪問.而非靜態成員必須例項化之後才會分配記憶體.

靜態全域性變數也具有全域性作用域,他與全域性變數的區別在於如果程式包含多個檔案的話,他作用於定義它的檔案裡,不能作用到其他檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同的靜態全域性變數,他們也是不同的變數。

從生命週期看:

全域性變數:程式執行期間

靜態全域性變數:程式執行期間

靜態區域性變數:程式執行期間

靜態成員變數:程式執行期間

區域性變數:作用域結束即銷毀

字串string, char* 動態分配大小

靜態字元陣列char 固定大小

類:類是具有相同屬性和服務的一組物件的集合。為屬於該類的所有物件提供了統一的抽象描述,其內部包括屬性和服務兩個主要部分。

class - 類 設計圖。在遊戲世界中設計圖是不會直接出現的,是虛擬抽象的概念。

物件:系統中用來描述客觀事物的乙個實體,是構成系統的乙個基本單位。乙個物件由一組屬性和對這組屬性進行操作的一組服務組成。

例項化:根據這個抽象的概念(類)建立出具體存在的「東西」(instance=物件)

變數:用來給例項「命名」,區分不同的例項,便於在使用時指明某個例項。

類是物件的抽象,而物件是類的具體例項。類是抽象的,不占用記憶體,而物件是具體的,占用儲存空間。類是用於建立物件的藍圖,它是乙個定義包括在特定型別的物件中的方法和變數的軟體模板。

prefab  <->  class

gameobject  <-> instance

component <-> 成員函式 + 成員變數

程式設計A課堂筆記

a.順序結構 從頭到尾一句接著一句的執行下來,直到執行完最後一句。資料型別包括 1.基本型別 基本整型 int 長整型 long int,long long int 單精度 float 雙精度 double 長雙精度 long double 字元型 char 2.構造型別 陣列 字串 3.算術運算 ...

課堂筆記 程式設計基礎

alt 提示 crtl shift f 文字格式優化 crtl shift o 匯入 刪除工具包 crtl shift x y 文字大小寫轉換 crtl 注釋所選行 和 只有在組合表示式第乙個 第二個和第三個輸入等都是真,組合表示式才是真。或 只要乙個組合表示式中有乙個部分為真,組合表示式就為真。異...

課堂筆記 程式設計基礎(續)

swith 算術表示式 注意 1.switch後面的括弧的算術表示式的資料型別必須是字元型 位元組型 短整形 整數。2.當算術表示式的值與某乙個case後面的常量表示式的值相等時,就執行case後面的語句。3.值都沒有表示式的值匹配的,就執行default後面的語句。4.每個case的常量表示式的值...