一.面向?qū)ο蟮膬?yōu)點: (1)良好的可復(fù)用性 (2)易維護(hù) (3)良好的可擴(kuò)充性
二.面向?qū)ο蟮幕靖拍?對象,類和繼承
三.注意初始化列表的初始化變量順序是根據(jù)成員變量的聲明順序來執(zhí)行的 重點:初始化列表的初始化順序,如果你直接用等于那就不一樣了
四.常量必須在構(gòu)造函數(shù)的初始化列表里面初始化或者將其設(shè)置成static
五.為什么說虛擬的析構(gòu)函數(shù)是必要的? 這是為了對抗多態(tài),比如說 B類繼承A類 此時有A類指針指向B類則在析構(gòu)的時候由于是靜態(tài)聯(lián)編,所以調(diào)用的是A類的析構(gòu)函數(shù),這就有可能造成內(nèi)存泄漏 相反的,將A類的析構(gòu)函數(shù)設(shè)為virtual型,則所以體驗CObject類的派生類的析構(gòu)函數(shù)都將自動變?yōu)関irtual型 保證了任何情況下,不會出現(xiàn)由于析構(gòu)函數(shù)未被調(diào)用而導(dǎo)致的內(nèi)存泄漏。
六.析構(gòu)函數(shù)可以為virtual型,構(gòu)造函數(shù)則不能,那么為什么構(gòu)造函數(shù)不能為虛? 虛函數(shù)采用一種虛調(diào)用的辦法。虛調(diào)用是一種可以在只有部分信息的情況下工作的機(jī)制,特別允許我們調(diào)用一個只知道接口而不知道其準(zhǔn)確對象類型的函數(shù),但是如果要創(chuàng)建一個對象,你勢必要知道對象的準(zhǔn)確類型,因此構(gòu)造函數(shù)不能為虛。
七.虛函數(shù)如此有效我們是否可以把每個函數(shù)都聲明為虛函數(shù)? 不行,這是因為虛函數(shù)是有代價的,由于每個虛函數(shù)的對象都必須維護(hù)一個v表,因此在使用虛函數(shù)的時候都會產(chǎn)生一個系統(tǒng)開銷,如果僅是一個很小的類,且不想派生其他類,那么根本沒必要使用虛函數(shù)。
八.String的賦值函數(shù)注意檢查自賦值
class String{public: //普通構(gòu)造函數(shù) String(const char* str = NULL); //拷貝構(gòu)造函數(shù) String(const String &other); //析構(gòu)函數(shù) ~String(void); //賦值函數(shù) String &Operator =(const String &other);PRivate: //用于保存字符串 char* m_data;};String::~String(void){ delete[] m_data;}String::String(const char* str){ if (str == NULL) { m_data = new char[1]; *m_data = '/0'; } else { int length = strlen(str); m_data = new char[length + 1]; strcpy(m_data, str); }}String::String(const String& other){ if (other.m_data == NULL) { m_data = NULL; } else { int length = strlen(other.m_data); m_data = new char[length + 1]; strcpy(m_data, other.m_data); }}String &String::operator = (const String& other){ //const的作用 //保證可以賦值常量 //還有保證s9=s7+s8;s9等都是String對象 //檢查自賦值 if (this == &other) { return *this; } delete[] m_data; //分配新的內(nèi)存資源并復(fù)制內(nèi)容 int length = strlen(other.m_data); m_data = new char[length + 1]; strcpy(m_data, other.m_data); //返回本對象的引用 return *this;}九. 重載和多態(tài)的區(qū)別 重載:參數(shù)列表不同 多態(tài):參數(shù)列表相同,一個接口,多種方法,接口重用
十.友元函數(shù) 例子
class Point{private: float x; float y;public: Point(float a = 0.0f, float b = 0.0f) :x(a),y(b) {}; friend float distance(Point& left, Point& right);};float distance(Point& left, Point& right){ return sqrt(((left.x - right.x) *(left.x - right.x) + (left.y - right.y) *(left.y - right.y))) ;}新聞熱點
疑難解答