Debug : 在單獨運行時,每每須要編譯器提供一些庫文件ios
Release : 能夠在沒有安裝visual c++的computer上正常運行c++
常規設置算法
1)
在共享DLL中使用MFC : 表示把程序中用到的MFC類庫做爲動態連接庫,這樣編譯生成器的程序比較小,可是在運行的時候,須要操做系統提供額外的動態庫支持。ide
2)
在靜態庫中使用MFC : 表示把用到的MFC類的內容做爲靜態庫加到程序中,這樣編譯產生的程序能夠在任何Windwos環境下運行,可是程序的體積比較大。函數
3)
使用標準Windows庫 : 表示不適用MFC類庫,僅使用標準的Windows類庫。學習
#define and const
宏的使用是在預處理的時候進行五條件的替換,並無明確指定這個常量的數據類型、因此帶來便利的同時也容易帶來問題。
因此出現了constthis
枚舉的使用---------------------------------spa
enum Weekday { mon, tue, wed, thu, fri, sat, sun };
枚舉默認的值是0,若是不想用默認,能夠直接賦值
枚舉定義以後,不能再修改其中某個元素的值操作系統
使用位操做符---------------------------------------------------.net
cout << "use transpose operator :" << endl; int iValue = 1; // iValue = iValue * 4; iValue = iValue << 34; // 34 % 32 = 2左移 由於超過了int的大小空間 cout << "iValue value is : " << iValue << endl;
內聯函數 :
能夠更形象地稱爲內嵌函數,它是C++對函數的一種特殊修飾。當編譯器編譯程序時,若是發現某段代碼在調用一個內聯函數,它就再也不去調用該函數,而是將該函數的代碼整段插入當前函數調用的位置。這樣就省去了函數調用的過程,提升了代碼的執行效率。關鍵字inline
函數重載 :
1)函數重載的意義在於能夠根據輸入參數的類型或者個數,自動地在多個重載函數中查找與之匹配的重載函數,從而只能地決定採用哪一個函數版本。
2)只有相互之間的參數類型或者個數不一樣,才能夠構成合法的重載函數
函數的聲明----也稱爲函數的接口
1)試一試在純c中使用接口------------------------------------------------
2)儘可能在函數中使用斷言assert判斷函數的有效性
3)函數的功能要作到單一----若是一個函數須要完成多項任務,最好拆分紅多個函數
面向對象的知識 :
1)封裝
在傳統的結構化程序設計思想中,數據和算法是相互分離的。
在面向對象的程序設計思想中,對象就是封裝數據和操做這些數據的算法的邏輯實體,也是現實世界中物體在程序中的反映,使用封裝有的時候能夠很好的保護對象的私有部分
2)繼承
從父親那裏獲得技能,本身又能夠繼續學習。好比我如今就站在前人的基礎上學習的c++
3)多態
就是指對象在不一樣狀況下具備不一樣形式的能力。多態機制使具備不一樣內部結構的對象能夠共享相同的外部接口。好比,給別人一幅畫,不必定是你本身畫的,也能夠直接把你老爸的畫送出
想一想 : 如何在面向對象程序設計思想上,考慮擴展、複用、可維護問題
new :
在new不成功是,沒必要去判斷指針是否爲null,由於new不成功時,系統會自動拋出std::bad_alloc異常,new操做永遠不會返回null
拷貝構造函數 :
默認也會有拷貝構造函數,當類中含有指針類型的屬性時,以拷貝內存形式出現的默認拷貝構造函數只能複製指針屬性的值,而不能複製指針屬性所指向的內存,在這個狀況下須要自定義類的拷貝函數,完成指針屬性等須要頁數處理的屬性的拷貝工做。
p163 拷貝構造函數
namespace Zeng { class CTest_A { public: CTest_A( int iValue, char* cName ) { this->m_iValue = iValue; this->m_pName = new char[ strlen( cName ) + 1 ]; strcpy( m_pName, cName ); } // 拷貝構造函數 CTest_A( const CTest_A& rCG ) { this->m_iValue = rCG.m_iValue; this->m_pName = new char[ strlen( rCG.m_pName ) + 1 ]; strcpy( m_pName, rCG.m_pName ); } void print() { cout << "CTest_G m_iValue value is : " << this->m_iValue << endl; cout << "CTest_G m_pName value is : " << this->m_pName << endl; cout << "CTest_G m_pName address is : " << *this->m_pName << endl; } public: int m_iValue; char* m_pName; }; // 試試拷貝構造函數 } int _tmain(int argc, _TCHAR* argv[]) { Zeng::CTest_A CA( 10, "Zengraoli" ); Zeng::CTest_A CA2( 10, "Zengraoli" ); Zeng::CTest_A CA3( CG ); cout << "CA print" << endl; CA.print(); cout << "\n"; cout << "CA2 print" << endl; CA2.print(); cout << "\n"; cout << "CA3 print" << endl; CA3.print(); cout << "class CTest_A size is : " << sizeof( Zeng::CTest_A ) << endl; return 0; }
P166 操做符重載
函數重載和操做符重載-------------------------------------
#include "stdafx.h" #include "iostream" using namespace std; namespace Zeng { class CTest_A { public: CTest_A() { } void print() { cout << "this is CTest_A print()" << endl; } }; // 佔1個字節的大小 class CTest_B : virtual CTest_A { public: CTest_B( int iValue ) : m_iValue( iValue ) { } void print() { cout << "m_iValue value is : " << m_iValue << endl; } private: int m_iValue; }; // 佔8個字節的大小 class CTest_C : virtual CTest_A { public: CTest_C() { } }; // 佔4個字節的大小 class CTest_D : virtual CTest_B { public: CTest_D( int iValue ) : CTest_B( iValue ) { this->m_iValue = iValue + 89; } void print() { cout << "m_iValue value is : " << this->m_iValue << endl; } private: int m_iValue; }; // 佔16個字節的大小 class CTest_E : public CTest_A { public: CTest_E( int iValue ) { this->m_iValue = iValue + 89; } void print() { cout << "this is CTest_E not parameter's print()" << endl; } void print( int iValue ) { cout << "this is CTest_E has parameter's print()" << endl; } /* int print( int iValue ) { cout << "this is CTest_E has parameter's print()" << endl; return 0; } // c++能夠忽略函數的返回值,因此只能靠參數不一樣來進行函數重載 */ private: int m_iValue; }; // 試試函數重載 class CTest_F { public: CTest_F( int iValue ) { this->m_iValue = iValue; } void print() { cout << "CTest_F m_iValue value is : " << this->m_iValue << endl; } const CTest_F& operator+ ( const CTest_F& rCF ) { this->m_iValue += rCF.m_iValue; return *this; } const CTest_F& operator= ( const CTest_F& rCF ) { this->m_iValue = rCF.m_iValue; return *this; } public: int m_iValue; }; // 試試操做符重載 } int _tmain(int argc, _TCHAR* argv[]) { Zeng::CTest_A CA; CA.print(); cout << "class CTest_A size is : " << sizeof( Zeng::CTest_A ) << endl; cout << "class CTest_B size is : " << sizeof( Zeng::CTest_B ) << endl; cout << "class CTest_C size is : " << sizeof( Zeng::CTest_C ) << endl; cout << "\n"; Zeng::CTest_D CD( 10 ); CD.print(); cout << "class CTest_D size is : " << sizeof( Zeng::CTest_D ) << endl; cout << "\n"; Zeng::CTest_E CE( 10 ); CE.print(); CE.print(1); cout << "class CTest_E size is : " << sizeof( Zeng::CTest_E ) << endl; cout << "\n"; Zeng::CTest_F CF( 10 ); Zeng::CTest_F CF2( 89 ); CF = CF + CF2; cout << "in class CTest_F override add after : " << sizeof( Zeng::CTest_F ) << endl; CF.print(); CF = CF2; cout << "in class CTest_F override equal after : " << sizeof( Zeng::CTest_F ) << endl; CF.print(); cout << "class CTest_F size is : " << sizeof( Zeng::CTest_F ) << endl; return 0; }
構造函數私有化的含義---------------------------------------------
namespace Rao { class CTest { public: static CTest* makeAnObject() { // 程序結束的時候 自動釋放 static CTest instance; return &instance; } ~CTest() { cout << "CTest Destructor...." << endl; } static int m_nValue; private: CTest() { m_nValue++; cout << "CTest Constructor...." << endl; } CTest( const CTest& CopyCTest ) { m_nValue++; cout << "CopyCTest Constructor...." << endl; } const CTest& operator= ( const CTest& ); }; } main: int Rao::CTest::m_nValue; cout << "\n"; cout << "use Constructor privatization :" << endl; Rao::CTest* RaoCTest = Rao::CTest::makeAnObject(); cout << "m_nValue :" << Rao::CTest::m_nValue << endl; Rao::CTest* RaoCTest2 = Rao::CTest::makeAnObject(); cout << "m_nValue :" << Rao::CTest::m_nValue << endl; // 調用拷貝構造函數 Rao::CTest sg = *Rao::CTest::makeAnObject(); cout << "m_nValue :" << Rao::CTest::m_nValue << endl;
類的成員訪問控制
public : 公有訪問接口
protected : 1)能夠供類自身訪問的成員 2)能夠供下級子類訪問的成員
private : 僅供類自身訪問的成員
友元函數
簡單理解爲 : 因爲類成員的訪問控制機制,很好地實現了數據的隱藏與封裝,類的成員變量通常定義爲私有成員,成員函數通常定義爲公有成員,以此來提供類與外界間的通訊接口;但有特殊的狀況,好比須要定義某個函數/某個類,這個函數/類不是類CA的一部分,但又須要頻繁地訪問類CA的隱藏信息,因此C++提供了一個"friend"關鍵字來完成這個任務。
友元函數和友元類都須要試一試--------------------------------------P172
但須要記住的一點 :
1)友元關係不能被繼承。這一點很好理解,咱們跟某個類是朋友,並不表示咱們跟這個類的兒子(派生類)一樣是朋友。
2)友元關係是單向的,不具備交換性。
#include "stdafx.h" #include "iostream" using namespace std; namespace Zeng { class CTest_A { public: CTest_A( int iValue ) { this->m_iValue = iValue; } void print() { cout << "CTest_A's m_iValue current value is : " << this->m_iValue << endl; } friend void firendFunction( const CTest_A& CA ); friend class CTest_B; private: int m_iValue; }; class CTest_B { public: CTest_B() { } void print( const CTest_A& CA ) { cout << "this's firend class CTest_B print : " << CA.m_iValue << endl; } private: }; // 友元類 void firendFunction( const CTest_A& CA ) { cout << "this's firend function print : " << CA.m_iValue << endl; } } int _tmain(int argc, _TCHAR* argv[]) { Zeng::CTest_A CA( 100 ); firendFunction( CA ); cout << "\n"; Zeng::CTest_B CB; CB.print( CA ); return 0; }