天天看點

C++_01_入門

一、類的定義

Person.h類聲明

C++_01_入門

Person.cpp類實作

C++_01_入門

main.cpp主函數

二、命名空間的使用

C++_01_入門
C++_01_入門

Xcode格式化代碼:快捷鍵ctrl + i

主函數:

C++_01_入門

三、類的繼承

父類Person

C++_01_入門
C++_01_入門

子類Girl

 Java PHP中使用關鍵定extends

 c++中冒号表示繼承,和Objective-C一樣

 冒号後面的public表示,繼承過來的東東公開

C++_01_入門
C++_01_入門

主函數main.cpp

C++_01_入門

四、構造和析構方法

類Object

C++_01_入門
C++_01_入門
C++_01_入門

五、運作父類的【構造方法】

C++_01_入門
C++_01_入門

//調用父類的構造方法

cpp是通過冒号實作

// Java和Objective-C中是通過superkeyword

// PHP使用parentkeyword

C++_01_入門
C++_01_入門

六、調用父類的方法

C++因為沒有superkeyword,是以,通過【父類名::方法()】調用某個父類的方法

C++還能夠指定調用哪一級父類的方法

// 因為c++沒有superkeyword,是以調用父類的方法:用的是【父類名::方法()】

// 優點就是,無論有多少重繼承,都能夠通過父類名去指定調用某一級的父類的方法。

是以,比Java中的superkeyword要強大

C++_01_入門
C++_01_入門
C++_01_入門
C++_01_入門
C++_01_入門

七、實函數、虛函數、純虛函數、函數重載

C++中,因為父類和子類都實作了cry方法【實函數】,

是以,僅僅會調用父類的cry方法

    假設,想要實作Java中的多态效果,

    那麼必須把【父類和子類】的cry方法所實用virtualkeyword聲明為【虛函數】

另外,C++純虛函數,類似Java中的抽象方法,由不同的子類去實作

C++_01_入門

子類 Girl

C++_01_入門
C++_01_入門

當父類和子類 都實作了【實函數cry】時的情況:直接調用父類的cry

C++_01_入門

當父類和子類的cryy方法都用【virtual】keyword聲明時。

與Java多态一樣,調用子類的方法

純虛方法

// 純虛函數,類似Java中的抽象方法,由不同的子類去實作

virtual

void hobby()=0;

C++_01_入門

八、C++中的類。假設全部方法全是純虛函數,那麼就是純虛類;

相當于Java中的接口。因為C++本身支援多繼承。是以,在使用時,盡量依照Java中的【單繼承實作多接口原則】,将其它父類設計成【純虛類】

九、函數重載,即名稱一樣,參數清單不同

C++的string類型 不用加*

C++_01_入門

十、運算符重載

//

重載 += 運算符

voidoperator+=(Point

other){

       add(other);

    };

傳回值operator運算符(參數清單){};

通過對象執行個體(或結構體)訪問,使用【.】

通過指針訪問  使用【->】

Point類

C++_01_入門
C++_01_入門
C++_01_入門

使用指針,->,解引用

C++_01_入門

十一、僞函數

像函數一樣調用,但不是函數,實質為:類或結構體

優點:能夠将一些代碼段,當作 一個類的對象執行個體,進行傳遞;如:作為方法回調,

C++_01_入門

十三、C++引用 &  【經常使用于參數清單中】

避免不必要的記憶體拷貝操作

C++_01_入門

十四、C++友元類

作用:将類中private成員,公開給特定的類【友元類】

由于不太好操控,so,Java語言就沒有此概念

C++中,訪問修飾符 預設就是:pravite

【在A類内部使用keywordfriend class Foo;】聲明友元類

此時,Foo類就能夠訪問A類中的私有成員(耦合度太高)

C++_01_入門

十七、檔案操作

右擊products,show in finder,能夠看到輸出的文本檔案

使用ofstream輸出到檔案1.txt

C++_01_入門
C++_01_入門

使用ifstream讀入debug檔案夾下的1.txt

C++_01_入門

stringbuf類 代表緩沖區;定義在頭檔案<sstream>中

C++_01_入門

十六、C++字元串

C++字元串包裝成一個類 string;重載了運算符 += 僅僅能接收字元串

導入<sstream>後,能夠使用類stringstream

它可連接配接不同類型的變量,

由于,它重載了運算符 << 

是以,能夠連接配接不同類型

而且傳回值是stream本身,是以,可連續<<

調用它str()方法,傳回c++字元串

繼續調用c_str()方法,傳回C字元串

C++_01_入門
C++_01_入門

C++ API 參數線上位址

C++_01_入門

string類的c_str()方法

C++_01_入門

stringstream類

C++_01_入門
C++_01_入門

stringstream類的str()方法

C++_01_入門

十五、C++标準容器庫container

注意疊代器是一個内部類,它的對象執行個體是一個指針,

在對list取value時,使用【*】解引用

在對map取key或value時,使用時【->】

list有序集合的使用和周遊

C++_01_入門

map字典的使用和周遊

為友善使用map,重載了操作符【】

C++_01_入門

C++API線上參考

C++_01_入門
C++_01_入門

十二、C++函數指針 僅僅是多了一個類型限定

void (Animal::*funcPointer)();

C++_01_入門

typedef void(Animal::*FuncPoint)();

定義一個類型,一個函數指針類型;

函數指針,指向的函數必須是Animal或它子類裡面的函數,而且沒有參數,傳回值是void

相比較c中的函數指針,僅僅是多一個類型限定:必須是Animal或它子類裡面的函數

C++_01_入門

通過線程+函數指針+sleep,達到延時3秒後運作目的

效果圖:

C++_01_入門

main.cpp代碼:

C++_01_入門
C++_01_入門

C++中的vector

vector類為内置數組提供了一種替代表示。與string類一樣 vector 類是随标準 C++引入的标準庫的一部分 。為了使用vector 我們必須包括相關的頭檔案  :

#include <vector>

使用vector有兩種不同的形式。即所謂的數組習慣和 STL習慣。

一、數組習慣使用方法

1. 定義一個已知長度的 vector :

vector< int > ivec( 10 );  //類似數組定義int ia[ 10 ];

能夠通過ivec[索引號] 來訪問元素

使用 if ( ivec.empty() ) 推斷是否是空,ivec.size()推斷元素個數。

2. vector的元素被初始化為與其類型相關的預設值:算術和指針類型的預設值是 0。對于class 類型,預設值可通過調用這類的預設構造函數獲得,我們還能夠為每一個元素提供一個顯式的初始值來完畢初始化,比如  

vector< int > ivec( 10, -1 ); 

定義了 ivec 它包括十個int型的元素 每一個元素都被初始化為-1 

對于内置數組 我們能夠顯式地把數組的元素初始化為一組常量值,比如 : 

int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };

我們不能用相同的方法顯式地初始化 vector ,可是能夠将 vector 初始化為一個已有數組的所有或一部分,僅僅需指定希望被用來初始化 vector 的數組的開始位址以及數組最末元的下一位置來實作,比如:  

// 把 ia 的 6 個元素複制到 ivec 中 

vector< int > ivec( ia, ia+6 );  

被傳遞給ivec 的兩個指針标記了用來初始化對象的值的範圍。第二個指針總是指向要拷貝的末元素的下一位置,标記出來的元素範圍也能夠是數組的一個子集,比如 :

// 拷貝 3 個元素 ia[2], ia[3], ia[4] 

vector< int > ivec( &ia[ 2 ], &ia[ 5 ] );

3. 與内置數組不同 vector 能夠被還有一個 vector 初始化 或被賦給還有一個 vector 比如  

vector< string > svec; 

void init_and_assign() 

    // 用還有一個 vector 初始化一個 vector 

    vector< string > user_names( svec ); 

    // ... 

    // 把一個 vector 拷貝給還有一個 vector 

    svec = user_names; 

}

二、STL習慣使用方法

在 STL9中對vector 的習慣使用方法全然不同。我們不是定義一個已知大小的 vector,而是定義一個空 vector  

vector< string > text;

1. 我們向 vector 中插入元素。而不再是索引元素,以及向元素指派,比如 push_back()操作,就是在 vector 的後面插入一個元素以下的 while 循環從标準輸入讀入一個字元串序列并每次将一個字元串插入到 vector 中  

string word; 

while ( cin >> word ) { 

text.push_back( word ); 

// ... 

盡管我們仍能夠用下标操作符來疊代訪問元素  

cout << "words read are: \n"; 

for ( int ix = 0; ix < text.size(); ++ix ) 

      cout << text[ ix ] << ' '; 

cout << endl; 

可是 更典型的做法是使用 vector 操作集中的begin()和 end()所傳回的疊代器 iterator  

對 :

for ( vector<string>::iterator it = text.begin(); 

    it != text.end(); ++it ) 

           cout << *it << ' '; 

cout << endl 

iterator 是标準庫中的類,它具有指針的功能 

*it; 

對疊代器解引用,并訪問其指向的實際對象  

++it;

向前移動疊代器 it 使其指向下一個元素  

2. 注意 不要混用這兩種習慣使用方法。 比如,以下的定義  

vector< int > ivec; 

定義了一個空vector 再寫這種語句  

ivec[ 0 ] = 1024; 

就是錯誤的 。由于 ivec 還沒有第一個元素。我們僅僅能索引 vector 中已經存在的元素 size()操作傳回 vector 包括的元素的個數 。

3. 類似地 當我們用一個給定的大小定義一個 vector 時,比如  :

vector<int> ia( 10 ); 

不論什麼一個插入操作都将添加vector 的大小,而不是覆寫掉某個現有的元素。這看起來好像是非常顯然的,可是 以下的錯誤在剛開始學習的人中并不少見 :

const int size = 7; 

int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 }; 

vector< int > ivec( size ); 

for ( int ix = 0; ix < size; ++ix ) 

    ivec.push_back( ia[ ix ]); 

程式結束時ivec 包括 14 個元素, ia 的元素從第八個元素開始插入。

繼續閱讀