C++類初學筆記

  1. 在定義類的任何對象以前,必須首先給出這個類的聲明。ios

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

  3. 兩種定義是等價的。第一種方式中x默認地定義爲私有成員函數

    class Z{優化

    int x;
       }

    和class Z{this

    private:
       int x;

    }.net

  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函數裏面,藍色定義有問題:老是顯示非法定義,拿出來做爲全局變量和函數就沒有問題。綠色的定義方式爲內聯函數。code

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<<'\n';
    }
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是錯誤的

相關文章
相關標籤/搜索