一、類的定義
Person.h類聲明

Person.cpp類實作
main.cpp主函數
二、命名空間的使用
Xcode格式化代碼:快捷鍵ctrl + i
主函數:
三、類的繼承
父類Person
子類Girl
Java PHP中使用關鍵定extends
c++中冒号表示繼承,和Objective-C一樣
冒号後面的public表示,繼承過來的東東公開
主函數main.cpp
四、構造和析構方法
類Object
五、運作父類的【構造方法】
//調用父類的構造方法
cpp是通過冒号實作
// Java和Objective-C中是通過superkeyword
// PHP使用parentkeyword
六、調用父類的方法
C++因為沒有superkeyword,是以,通過【父類名::方法()】調用某個父類的方法
C++還能夠指定調用哪一級父類的方法
// 因為c++沒有superkeyword,是以調用父類的方法:用的是【父類名::方法()】
// 優點就是,無論有多少重繼承,都能夠通過父類名去指定調用某一級的父類的方法。
是以,比Java中的superkeyword要強大
七、實函數、虛函數、純虛函數、函數重載
C++中,因為父類和子類都實作了cry方法【實函數】,
是以,僅僅會調用父類的cry方法
假設,想要實作Java中的多态效果,
那麼必須把【父類和子類】的cry方法所實用virtualkeyword聲明為【虛函數】
另外,C++純虛函數,類似Java中的抽象方法,由不同的子類去實作
子類 Girl
當父類和子類 都實作了【實函數cry】時的情況:直接調用父類的cry
當父類和子類的cryy方法都用【virtual】keyword聲明時。
與Java多态一樣,調用子類的方法
純虛方法
// 純虛函數,類似Java中的抽象方法,由不同的子類去實作
virtual
void hobby()=0;
八、C++中的類。假設全部方法全是純虛函數,那麼就是純虛類;
相當于Java中的接口。因為C++本身支援多繼承。是以,在使用時,盡量依照Java中的【單繼承實作多接口原則】,将其它父類設計成【純虛類】
九、函數重載,即名稱一樣,參數清單不同
C++的string類型 不用加*
十、運算符重載
//
重載 += 運算符
voidoperator+=(Point
other){
add(other);
};
傳回值operator運算符(參數清單){};
通過對象執行個體(或結構體)訪問,使用【.】
通過指針訪問 使用【->】
Point類
使用指針,->,解引用
十一、僞函數
像函數一樣調用,但不是函數,實質為:類或結構體
優點:能夠将一些代碼段,當作 一個類的對象執行個體,進行傳遞;如:作為方法回調,
十三、C++引用 & 【經常使用于參數清單中】
避免不必要的記憶體拷貝操作
十四、C++友元類
作用:将類中private成員,公開給特定的類【友元類】
由于不太好操控,so,Java語言就沒有此概念
C++中,訪問修飾符 預設就是:pravite
【在A類内部使用keywordfriend class Foo;】聲明友元類
此時,Foo類就能夠訪問A類中的私有成員(耦合度太高)
十七、檔案操作
右擊products,show in finder,能夠看到輸出的文本檔案
使用ofstream輸出到檔案1.txt
使用ifstream讀入debug檔案夾下的1.txt
stringbuf類 代表緩沖區;定義在頭檔案<sstream>中
十六、C++字元串
C++字元串包裝成一個類 string;重載了運算符 += 僅僅能接收字元串
導入<sstream>後,能夠使用類stringstream
它可連接配接不同類型的變量,
由于,它重載了運算符 <<
是以,能夠連接配接不同類型
而且傳回值是stream本身,是以,可連續<<
調用它str()方法,傳回c++字元串
繼續調用c_str()方法,傳回C字元串
C++ API 參數線上位址
string類的c_str()方法
stringstream類
stringstream類的str()方法
十五、C++标準容器庫container
注意疊代器是一個内部類,它的對象執行個體是一個指針,
在對list取value時,使用【*】解引用
在對map取key或value時,使用時【->】
list有序集合的使用和周遊
map字典的使用和周遊
為友善使用map,重載了操作符【】
C++API線上參考
十二、C++函數指針 僅僅是多了一個類型限定
void (Animal::*funcPointer)();
typedef void(Animal::*FuncPoint)();
定義一個類型,一個函數指針類型;
函數指針,指向的函數必須是Animal或它子類裡面的函數,而且沒有參數,傳回值是void
相比較c中的函數指針,僅僅是多一個類型限定:必須是Animal或它子類裡面的函數
通過線程+函數指針+sleep,達到延時3秒後運作目的
效果圖:
main.cpp代碼:
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 的元素從第八個元素開始插入。