C++類初學筆記

Tenacity發表於2019-05-10
  1. 在定義類的任何物件之前,必須首先給出這個類的宣告。

  2. 類的私有成員具有類範圍性質:類的私有成員僅能由類的成員函式訪問。

  3. 兩種定義是等價的。第一種方式中x預設地定義為私有成員

    class Z{

       int x;
       }

    和class Z{

       private:
       int x;

    }

  4. 關鍵字class和struct的區別
    兩者都可以建立類,class:類成員在預設狀態下是私有的;使用struct關鍵字,類成員在預設狀態下是公有的。

  5. 類成員函式的定義

class Person
{
    public:
        void            setAge( unsigned n );//{age = n;}
        unsigned    getAge() const;//{return age;}
    private:
        unsigned age;
};
void Person::setAge( unsigned n )
{
    age = n;
}
unsigned Person::getAge() const
{ 
    return age;
}

兩種不同定義的方式
如果定義在main函式裡面,藍色定義有問題:總是顯示非法定義,拿出來作為全域性變數和函式就沒有問題。綠色的定義方式為行內函數。

6.通過在進行成員函式宣告的時候使用inline關鍵字,可將原本定義在類宣告之外的成員函式強 制變成行內函數。

7.一般情況下,應該採用引用方式進行物件的傳遞和返回,而不要採用傳值的方式來進行。這是 因為通過傳值方式來傳遞和返回物件時會降低效率並將面臨物件的拷貝操作,從而是資料增大,浪費記憶體。
兩者效率相同,但是引用方式的語法要簡練的多。

8.不要以引用方式在函式中返回一個區域性auto變數。因為函式返回的時候這個變數已經不在了。

9.通常,如果一個物件通過引用方式傳到函式f中,而函式f又不會通過修改物件中的資料成員的值改變物件的狀態,
那麼最好將f的引數標記為const,可以預防對引數的誤寫,同時有些編譯器還可以對這種情況進行優化。

10. 如果一個成員函式不需要直接或者間接地改變該函式所屬物件的任何資料成員,那麼最好將這個成員函式標記為const。
eg:int get() const{ return num;}—–只讀函式
可以預防對該函式所屬資料成員的誤寫。

11. 一個const成員函式只能呼叫其他const成員函式。呼叫非const成員函式可能會間接的改變物件的狀態。

12. 建構函式不能有返回型別。建構函式引數的數量和型別不同。預設構造不帶引數。建構函式最大的特點:函式名與類名相同,沒有返回型別。

class Stack{
Stack(){initiative();}預設建構函式中呼叫了init成員函式。
}

13. 多數情況下,編譯器為類生成一個共有的預設建構函式,只有下面兩種情況例外:

• 一個類顯式的宣告瞭任何建構函式
• 一個類宣告瞭一個非公有的預設構造引數(定義在private裡)

14. 拷貝建構函式:建立一個新的物件,此物件是另外一個物件的拷貝品
如果類的設計者不提供拷貝建構函式,編譯器會自動生成一個:將源物件所有資料成員的值逐一賦值給目標物件相應的資料成員。拷貝前後位於不同的地址空間,儘管他們有相同的成員變數值。

15. 如果拷貝建構函式是私有的,頂層函式和其他類的成員函式就不能通過傳值來傳遞和返回該類的物件,因為這兩個操作都需要呼叫拷貝建構函式。涉及到動態問題的時候預設拷貝函式會有問題。都是引用型別。

class abc
{
public:
    abc() {num = 10;}//default
    abc(const abc& def)
    {
        num = def.num;
    }
    void getnum()
    {
        cout << num<<`
`;
    }
private:
    int num;
};
int main()
{
    abc s1;
    abc s2(s1);//括號裡的是原來的,括號外的是新的
    s2.getnum();
}

這部分還沒怎麼看懂。先留個連結。
http://blog.csdn.net/lwbeyond/article/details/6202256

16. 轉型建構函式可以進行隱式型別轉換

void f(Person p);
string s = "abc";
f(s);

如果Person中有這樣的轉型建構函式

Person(string s);

那麼就可以通過。

explicit Person(const string& n){name = n;}

關閉這種轉換。

17. 只能用初始化列表對const型別變數進行初始化
18. 解構函式:摧毀物件,出現情況:

+ 以某個類作為資料型別的變數超出其作用範圍
+ 用delete操作符刪除動態分配的物件

解構函式不帶引數,所以不能被過載,這樣每個類只能有一個解構函式。注意,沒有返回值型別。
19. 檔案開啟模式 outfile.open(xxx, ios::app)

in    開啟檔案用於讀取
out    開啟檔案用於寫入
ate    開啟檔案並移到末尾
app    開啟檔案用於追加
trunc    若檔案已存在,開啟檔案並擷取流(清除原來的資料)
binary    以二進位制流方式開啟檔案

20. 在類宣告內部宣告的static資料成員必須在任何程式塊之外定義。而且,static成員不影響類的sizeof。

21. 如果將成員函式內的某個區域性變數定義為靜態變數,該類的所有物件在呼叫這個成員函式時,將共享這個變數。

22. 在成員函式內部可以用指標常量this來訪問與成員函式的呼叫相關聯的物件。this指標是一個常量,它不能作為賦值,遞增,遞減等運算的目標物件。this也只能在非static成員函式中才有效。

23. 如果要在類宣告之外定義inline函式,關鍵字inline只能出現在該函式的宣告中。

24. 在static成員函式內使用this是錯誤的

相關文章