C++學習(50)

王小東大將軍發表於2017-06-21

1.  程式開發過程:編輯、編譯預處理、編譯、連線、執行。

2.  比較 #includefile.hVS.  #include<file.h>


當用#include“file.h”時,先搜尋當前工作目錄,如果沒有,再去搜尋標準庫,庫沒有再搜尋資源庫;

當用#include<file.h>時,編譯器先從標準庫開始搜尋,如果沒再搜尋資源庫目錄,若還未找到則搜尋當前工作目錄。

題中的兩種方式都會找到stdio.h(存在於標準庫),通過<>,(庫裡)一步就找到了。

兩者在程式的執行速度上一樣,但是在編譯速度上不同。

 

3.  友元能夠通過類的物件訪問類的所有成員。(正確)

(友元相當於在一個盒子上開了一個洞,既然一個盒子有洞,那麼你就可以拿出這個箱子的任何東西。)

 

4.  C++的虛擬函式必須是類的一個成員,而不允許是類的友元。

 

5. 呼叫拷貝建構函式的3情況:

1)、用一個物件去初始化同一個類的另一個新物件時; 

2)、函式的形參物件,呼叫函式進行形參和實參結合;

3)、函式的返回值是類的物件,函式執行返回撥用時 將一個物件賦值給另一個物件,兩個物件都存在,呼叫的是賦值建構函式,不涉及記憶體的分配。 當被賦值的物件不存在呼叫的是拷貝建構函式;

 

6.  分析下列程式,則建構函式中,成員變數一定要通過初始化列表初始化的是:bc

class A{
      ...
      private:
           int &a;
};
class B:public A{
      ...
      private:
           int a;
      public:
           const int b;
           A c;
           static const char *d;
           A* e;      
};


分析一:需要初始化列表的三種:引用、const和沒有預設建構函式的成員物件

c需要初始化不是因為它的成員有引用,而是因為類A中沒有合適的建構函式。

d,底層const,允許改變d的值,亦可不必初始化。

e,指向的東西是可變的,只要滿足類A中要求即可。指標與引用的區別,定義一個引用時候必須要初始化,而且不能改變。定義一個指標時候,不用初始化,還可以更改指向。

 

const、引用在初始化列表中初始化。static在類外初始化。 普通變數可以在初始化列表也可以在建構函式裡面賦值

 

分析二:常量成員和引用成員自然是要初始化的,問題就在這static成員。 static成員是不允許在類內初始化的,除了const,那麼static const 成員是不是在初始化列表中呢? 答案是NO

 

一是static屬於類,它在未例項化的時候就已經存在了,而建構函式的初始化列表,只有在例項化的時候才執行

二是static成員不屬於物件。我們在呼叫建構函式自然是建立物件,一個跟物件沒直接關係的成員要它做什麼呢。

 

還有一個問題就是上面那個仁兄說的,需要初始化的資料成員是物件(繼承時呼叫基類建構函式) ;這個顯然是不對的。下面程式碼能夠很好說明了這個問題。c需要初始化不是因為它是類物件,是因為他的成員有引用。

class A { private:   int a; };
class B : public A{
private:    
      int aa;
public: B(int i ):aa(i),b(9){};  
   const int b;
    A c;
};


 

 

相關文章