1. 程式人生 > >面試題-面向物件-靜態成員變數以及靜態成員函式

面試題-面向物件-靜態成員變數以及靜態成員函式

問題1:
問:在類中,靜態資料成員和普通資料成員有何區別?
答:

1.普通資料成員屬於類的物件,物件被建立後,普通資料成員才會分配記憶體。靜態資料成員屬於整個類,即使沒有建立物件,它也存在。
2.只能在類外進行初始化,預設初始化為0;
3.可以使用類的物件,引用或指標訪問靜態資料成員
4.類的任何成員函式都可以訪問類的靜態資料成員
5.和普通成員一樣,都可以有訪問級別(如public),可以具有返回值,const修飾等

分析:
1.
class A
{
public:
 static int i;
 int j;
 A()
 {
  j = 1;
 }
 void fun()
 {
  cout << &i << endl;//a1和a2物件輸出的地址是一樣的
  cout << &j << endl;//a1和a2物件輸出的地址是不一樣的
 }
};
int A::i = 10;//2.

靜態資料成員初始化,只能在類外。若未賦初值,自動預設為0;
void main()
{
 A a1;
 a1.fun();
 A a2;
 a2.fun();
}
-----------------------------------------------------------------------
問題2:
問:靜態資料成員會通過哪些被訪問?
答:

1.普通成員函式
2.靜態成員函式
3.類的物件,引用或指標
-----------------------------------------------------------------------
問題3:
問:使用靜態資料成員的好處?
答:

1.節約儲存空間(比如多個物件共享類的靜態資料成員)
2.方便操作(銀行的利息改變,所有的物件的利息會改變)
3.資訊隱藏,提高安全性(把靜態資料成員設定為private,物件不能直接呼叫它,全域性變數不能保證安全性)
------------------------------------------------------------------------
問題4:
問:靜態成員函式是什麼?作用是什麼?

答:與靜態資料成員一樣,我們也可以建立一個靜態成員函式,它為類的全部服務而不是為某一個類的具體物件服務。靜態成員函式與靜態資料成員一樣,都是類的內部實現,屬於類定義的一部分。普通的成員函式一般都隱含了一個this指標,this指標指向類的物件本身,因為普通成員函式總是具體的屬於某個類的具體物件的。通常情況下,this是預設的。如函式fn()實際上是this->fn()。但是與普通函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。從這個意義上講,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,它只能呼叫其餘的靜態成員函式和靜態資料成員。不過在特殊情況下,它可以訪問非靜態成員函式和非靜態資料成員,也就是在靜態成員函式裡或者形參是本類的物件的時候。
-----------------------------------------------------------------------
問題5:


問:靜態成員函式可以訪問誰?

答:靜態資料成員和靜態成員函式。特殊情況下,還可以訪問普通成員函式和普通成員變數,不過得要在靜態成員函式裡或形參建立物件。
分析:
static void fun(A a)
{
a.fun();//fun()是普通函式
cout<<a.j;//j是普通成員變數。
}
-----------------------------------------------------------------------
問題6:
問:靜態成員函式可以被誰訪問?
答:

1.靜態成員函式
2.普通成員函式
3.類名,物件

----------------------------------------------------------------------

問題

問:const方法在程式中有何作用?

答:const方法只允許在方法體中訪問類的資料成員,而不允許修改資料成員,而且在const方法中也不能夠呼叫其他的非const方法。在設計應用程式時應儘量使用const方法,這樣可以防止使用者非法修改物件,更好地體現面向物件中的封裝特性。

分析:

class CUser
{
private:
 char m_Username[128];
 char m_Password[128];
 void fun()
 {
 }
public:
 void GetUsername(char Name[])const
 {
  strcpy(m_Password, "chen");//錯誤,不允許修改資料成員
  strcpy(Name, m_Username);
  fun();//錯誤,只能訪問資料成員,而不是函式
 }

};