內(nèi)聯(lián)函數(shù)直接在頭文件中定義。
string.h
#ifndef __MYSTRING_
#define __MYSTRING_
#include
class String
{
public:?
? ? ? ? ? string(const char* str = 0){}
? ? ? ? ? String(const String* s) {}
? ? ? ? ? ?String& operator=(const String& s){}
? ? ? ? ? ? ~String(){}
char* Data()const {return this->data;}private:char* data;};
ostream& operator<<(ostream& os,const String& s)
{
? ? ? ? ? ?return os << s.Date();
}
#endif
//Big Three 三巨頭:指的是 帶指針的類的拷貝構(gòu)造函數(shù)、拷貝賦值函數(shù)、析構(gòu)函數(shù)。
淺拷貝:按值拷貝。
深拷貝:按內(nèi)容拷貝,適用于有指針成員的類。
自賦值:a = a;?
內(nèi)存管理:棧、堆
棧:CPU自動管理。不需要程序員來管。
堆:操作系統(tǒng)的資源,需要程序員自己申請和自己釋放。不釋放會造成內(nèi)存泄漏。
函數(shù)調(diào)用棧:用來防止函數(shù)內(nèi)部局部變量、函數(shù)入口參數(shù)以及函數(shù)返回值等。
//global?
Complex c3(3,4);? data段。
void function()
{
? ? ? ? Complex c1(2,3);
? ? ? ? ?Complex* p = new Complex(1,2);//
? ? ? ? ?delete p;
? ? ? ? ? static Complex c4(3,5);
}
C++ 運算符 new的工作過程:先分配內(nèi)存,然后調(diào)用 構(gòu)造函數(shù)。
Complex* pc = new Complex(1,2);
new 《=等價于=》?
? ? ? ?Complex* pc;
? ? ? ?void * mem = operator new (sizeof(Complex));//內(nèi)部調(diào)用malloc();
? ? ? ?pc = static_cast(mem);pc->Complex::Complex(1,2);
? ? ? ? String* ps = new String("hello");
delete <<=等價于=>>
? ? ? ? 1、先析構(gòu)。String::~String(ps);
? ? ? ? ?2、再釋放內(nèi)存。 operator delete(ps);
?delete[] 必須和 new []對應(yīng)? ? ? 不然會造成內(nèi)存泄漏.
delete? 和 new? 對應(yīng)。
static:類的靜態(tài)數(shù)據(jù)成員,是類的所有對象共享的,它存儲在 內(nèi)存的靜態(tài)數(shù)據(jù)區(qū)域,某一個類的對象修改了static數(shù)據(jù)成員,所有的類的其他對象都可見這種修改。
類的靜態(tài)數(shù)據(jù)成員初始化只能在類外進行,如: int ClassName::m_static_data = 9;這個類似于全局變量的初始化。
類的靜態(tài)函數(shù)沒有this指針,因此只能訪問類的靜態(tài)函數(shù)或靜態(tài)數(shù)據(jù)成員。
靜態(tài)函數(shù)可以通過對象.fun_static()來訪問?;蛘咧苯佑?b>類名::fun_static()調(diào)用。
單實例類---設(shè)計模式
模板類:
template Ttemplateclass B
? ? ? {?
?? ? }
模板就是實現(xiàn)代碼重用機制的一種工具,它可以實現(xiàn)類型參數(shù)化,即把類型定義為參數(shù),從而實現(xiàn)了真正的代碼可重用性。
模版可以分為兩類,一個是函數(shù)模版,另外一個是類模版。
模板函數(shù):引數(shù)推導。
運算符重載。
templateT min(T x,T y)
C++標準算法庫:模板函數(shù)。通用算法庫。
命名空間:包裝一下代碼、數(shù)據(jù);便于隱藏,防止重名。
object based? 基于類, 面向?qū)ο蟆?/p>