標籤:
參考自《C++ primer plus 6th edition》
請各位放大觀看吧,感覺部落格園的編輯器有點坑。用圖片之後,又發現太小,所以...
程式對記憶體的使用:
連結:http://zhidao.baidu.com/link?url=An7QXTHSZF7zN9rAuY05mvaHHar0xIpgK6Yqp9oAkm2GmZYoTAz9UpN4JuhWJvSLsbu0-lOcO47PzXcNWda6gK
定義靜態成員變數:
可以在類聲明中定義靜態成員變數,使用 static 修飾。不過,雖說是成員變數,但是不屬於這個類的任何一個對象。它們是是分開儲存的。
因為對所有對象,這個變數的值都是一樣的,儲存上也只用存一份就好。訪問的時候,使用 "className::varName" 即可。絕大多數語言中可以定義靜態變數,只是法上稍有不同。Java中的靜態變數,既可以通過對象來訪問,也可以通過類來訪問。C++中就只能通過類名來訪問。不過,Java通過對象來訪問靜態變數,實質上是通過類名來訪問的。好吧,這個問題無關痛癢。
其次,C++不允許在類聲明中初始化靜態成員變數。而且初始化的時候要使用範圍運算子,"className::varName"。一種"內部"的感覺。
在類中定義常量:
1. 編譯時間確定的常量
儲存: 對所有對象而言,這個常量都是一樣的。因此和對象分開儲存,僅保留一份副本。
實現: 1. 枚舉: 如 enum {SIZE = 100 }; 這就定義了一個枚舉常量 SIZE = 100。
當然,你可以定義多個,並給定類型名。
2. 靜態成員變數: 如 const static int a = 5;
3. 用const限定並初始化, 如聲明成員 const int id = 5 (C++ 11 拓展)
2. 運行時確定的常量
儲存: 不同對象,可以有不同常量,屬於對象的普通成員
實現: 聲明用const修飾的成員,然後用建構函式的成員初始化列表.
#include <iostream>class Student{public: const int id; Student(int ID) : id(ID) { }};int main() { Student a(10); // a的id常量為10 Student b(20); // b的id常量為20 std::cout << a.id << " " << b.id << std::endl;}View Code
成員初始化列表的初始化工作,是在對象建立後,建構函式函數體的代碼執行前做的。對於內建類型成員的初始化,
不管是放在初始化列表中初始化,還是放在函數體中初始化,效率是一樣的。不過,對於對象成員來說,使用初始化列表
來初始化,效率更高。暫且不提。要注意的一點是: 成員初始化列表只能用於構造函數。
複製建構函式 與 賦值運算子:
基本概念:
考慮兩種情況:
其他的的記憶體配置、回收問題
將涉及定位new的使用。(不考慮記憶體不夠用的情況)
一個簡單的例子:
#include <iostream>#include <string>#include <new>using namespace std;class Student{private: string name;public: Student(const string& s): name(s) { } ~Student() { cout << name << " destroyed\n"; }};int main() { double * buffer = new double[512]; Student *s1 = new (buffer) Student("Peter"); Student *s2 = new (buffer + sizeof(Student)) Student("Tom"); /* 下面兩條語句將引發錯誤,後面delete[] buffer, * 導致同一塊記憶體被釋放兩次*/ //delete s1; //delete s2; /*顯式調用解構函式, 這裡按棧的順序了,其實都行,不走尋常路 o_O */ s2->~Student(); s1->~Student(); delete[] buffer; return 0;}View Code
C++ 學習筆記之---類和動態記憶體分配