C++ 學習筆記之---類和動態記憶體分配

來源:互聯網
上載者:User

標籤:

參考自《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++ 學習筆記之---類和動態記憶體分配

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.