[C++]01 面向對象中的問題

一.構造函數/析構函數是什麼,具體意義是什麼?

  1.構造函數就是在內存開闢後對內存進行初始化的操做,當構造函數調用完了,咱們就說一個對象產生了。構造函數不是給對象開闢內存的。析構函數就是在對象內存釋放以前將對象佔用的其餘資源釋放掉。析構對象不是用來釋放內存的函數

  2.構造函數和析構函數的名字必須和類名相同,析構函數名字前加~。優化

  3.構造函數和析構函數沒有返回值。this

  4.構造函數能夠任意帶參,因此說構造函數是能夠重載的,析構函數不能帶參,因此析構函數只有一個。spa

  5.當類中沒有構造/析構函數的時候,編譯器會給出不作任何操做的默認構造/析構函數。若是在類中定義了任意的構造函數,就不會產生默認構造函數了。指針

二.this指針是什麼?

  咱們都知道,一個類能夠產生多個對象,每一個對象都有本身的成員變量,這些對象共享這個類的成員方法。那麼問題就來了,多個對象共享成員方法,那麼當對象調用成員方法的時候,這些成員方法是如何知道是哪一個對象進行的調用呢? this指針就是這個問題的回答code

  類的成員方法一經編譯,形參都會加上一個當前類類型的this指針變量,對象調用成員方法時,就將對象的地址做爲方法的實參進行傳遞,這樣就精準的將對象和成員方法聯繫在了一塊兒。須要注意的是,在方法中訪問其餘成員,都是經過this指針來調用的。對象

三.關於對象淺拷貝和深拷貝的問題  

  淺拷貝:簡單來講,淺拷貝能夠理解爲直接將值複製給將要拷貝的對象。若其中有變量指向外部資源,那麼也只是會直接指向同一塊外部資源。blog

      深拷貝:能夠理解爲,若一個類擁有外部資源,且當這個類的對象發生拷貝的時候,會爲新對象分配新的資源。內存

      >預防淺拷貝問題的方法:ci

        1)自定義拷貝構造函數和賦值運算符重載函數

        2)將這兩個函數私有化,從根本上杜絕淺拷貝的問題

四.memcpy,realloc等函數可否做用於對象的內存拷貝

  memcpy函數用於把資源內存拷貝到目標內存,realloc函數的功能是將mem_address所指內存區域大小重置位newsize。這樣的函數是不能夠做用於對象的內存拷貝的,由於對象中可能有申請的外部資源,這些函數只進行內存拷貝,不會對對象的外部資源進行拷貝,會出現淺拷貝的問題。在析構時就會由於重複析構同一塊外部資源而產生錯誤。

五.構造函數的初始化列表

若是想在對象成員變量初始化的時候,指定成員變量的初始化方式,那麼應該在構造函數的初始化列表中指定。

class A
{
public:
    A(int a,int b,int c)
    :_x(a),_y(b),_z(c)//初始化列表
    {}
private:
    int _x;
    int & _y;//引用必須在定義的時候初始化,而且不能從新賦值,因此必須在初始化列表中初始化
    const int _z;//常量成員只能初始化不能賦值,因此必須在初始化列表中初始化
};

    須要注意:成員的初始化順序是在類中定義出現的順序初始化的,而不是按照初始化列表的順序初始化的。

六.普通成員方法,const成員方法和static靜態成員方法的異同

七.普通成員變量,const常/引用成員變量,static成員變量各自的初始化應該怎麼寫

八.如何計算對象內存的大小,如何查看對象內存的大小

九.關鍵字explicit、mutable

  explicit關鍵字的做用是:只有明確的調用構造函數,纔會構造對象,不然會報編譯錯誤。它的做用是防止隱式產生臨時對象。須要注意的是,explicit只能夠修飾構造函數

  mutable的意思是可變的,易變的。在C++中,若是一個成員函數被const修飾,那麼它將沒法修改其成員變量,可是若是成員變量被mutable修飾,那麼就能夠突破const的修飾。

十.對象的生存週期,構造、拷貝構造、賦值、析構的詳細過程

十一.成員方法若是返回一個對象的值,返回的值的處理過程

十二.對象建立的優化問題

十三.指向類成員的指針,函數指針和變量指針。   

相關文章
相關標籤/搜索