問題一:定義了一個類,其指針成員是用new來初始化的,請指出可能出現的三個問題及其解決方法:
答:
首先,當這種類型的對象過期時,對象的成員指針指向的數據仍將保留在內存中,這將佔用空間,同時不可訪問,因爲指針已經丟失。可以讓類析構函數刪除構造函數中new分配的內存,來解決這種問題。
其次,析構函數釋放這種內存後,如果程序將這樣的對象初始化爲另一個對象,則析構函數將試圖釋放這些內存兩次。這是因爲將一個對象初始化爲另一個對象的默認初始化,將複製指針值,但不復制指向的數據,這將使兩個指針指向相同的數據。解決方法是,定義一個複製構造函數,使初始化複製指向的數據。
第三,將一個對象賦給另一個對象也將導致兩個指針指向相同的數據。解決方法是重載賦值運算符,使之複製數據,而不是指針。
問題二:靜態成員和靜態成員函數的總結:
一、靜態成員的特點:
(1)static數據成員在類的內部聲明,但只能在類的外部定義,在類的外部不能指定static,在類的定義時候進行初始化;
(2)static數據成員只能在類的外部進行初始化(特例:當整型const static數據成員被常量表達式初始化時,就可以在類的內部進行初始化,但還需要在外部進行定義)。
(3) static數據成員可以是該成員所屬的類類型,而非static數據成員只能自身類的引用或者指針。(4) static數據成員可以用作類成員函數的默認實參。
(5) static數據成員的值可以改變。
二、靜態成員和非靜態成員的區別:
(1) 靜態變量使用 static 修飾符進行聲明,在類被實例化時創建,通過類和對象都可以進行訪問;(2)不帶有 static 修飾符聲明的變量稱做非靜態變量,在對象被實例化時創建,通過對象訪問;
(3) 一個類的所有實例的同一靜態變量都是同一個值,同一個類的不同實例的同一非靜態變量可以是不同的值。
(4) 靜態函數的實現裏不能使用非靜態成員,如非靜態變量、非靜態函數等。
三、靜態成員函數的特點:
(1) static 成員函數沒有 this 形參,它可以訪問所屬類的 static 成員,但不能訪問非 static 成員。(2)static成員函數既可以在類的內部定義,也可以在類的外部定義,在外部定義時,不能重複指定static保留字。
(3)static成員函數不能聲明爲虛函數,不能實現動態綁定
(4)static 成員函數不能聲明爲const,因爲const是針對this是不是const而言的
(5)構造函數、析構函數不能爲靜態函數。