一、struct與class的區別算法
答:struct默認的訪問控制是public,class默認的訪問控制是private;還有一點就是定義模版參數時,class做爲一個關鍵字,相似於typename的做用。緩存
二、常見的智能指針有哪些安全
答:primer上提到了三種,shared_ptr、unique_ptr和weak_ptr。其中shared_ptr容許多個指針指向對象,而unique_ptr是獨佔的指向對象;weak_ptr它指向shared_ptr所管理的對象,但不控制所指向對象的生存期,也就是說不會改變share_ptr的引用計數。函數
三、new與malloc的區別this
答:首先是操做的對象不一樣:malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符,對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數,於malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。 spa
而後是用法的不一樣:malloc返回的是void*類型,因此molloc的時候顯示進行類型轉換,malloc自己也不識別內存類型,於是需指定轉換的內存的總字節數;指針
函數原型:void* malloc(size_t size);code
例如申請一塊長度爲20的int類型的內存,程序以下對象
int *p=(int*)malloc(sizeof(int)*20);blog
new則內置了sizeof,類型轉換與類型安全檢查功能,於是不須要進行類型轉換和指定內存大小,同時new在建立的同時也能夠同時完成初始化工做。
函數原型:void free(void *memblock);
例如一樣申請長度20的int類型的內存,程序以下
int *p=new int[20]; //刪除時用delete []p;
申請內存,同時初始化
int *p=new int(12);
四、new的實現
答:這裏首先要區分new operator、operator new和placement new
new operator就是new的操做符,不能夠被重載,咱們是使用new這個操做符的時候就是new operator,
但當咱們new一個對象時,會分爲兩步,第一步經過operater new分配足夠的空間,第二步調用相關對象的構造函數。
operator new 負責分配要求的空間,不調用相關的構造函數,能夠被重載。
C* p=new C; //new爲new operator,它將調用類C的operator new,爲該類分配空間,而後再調用當前實例的構造函數。
placement new 只是operator new重載的一個版本,並不分配內存,只是返回指向已經分配好的某段內存的一個指針。所以不能刪除它,但須要調用對象的析構函數。
使用它通常分爲五步:提早分配緩存,對象分配,使用,對象的析構,釋放。
於是這裏所說的new的實現應該指的是operator new的實現,底層仍然是malloc來實現內存的分配的。
五、vector內存的擴展是怎麼實現
答:vector支持快速隨機訪問也支持內存空間的擴容,但vector在添加新元素空間不足,從新分配一段更大的內存空間,將就舊空間的原來的元素移到新空間再添加新的元素,釋放舊的存儲空間。vector自己提供了管理容量的成員函數:
std::vector<T> c;
c.size();c.capacity();c.reserve(100);
size是當前容器已保存的元素個數,capacity是不分配新的空間的前提下最多能夠保存多少元素,reserve預先分配一個指定大小的內存(只能夠比原來的大,若是參數值小於原來的內存大小則不變化)
六、單例模式如何實現
答:單例模式的定義:保證一個類僅有一個實例,而且提供一個訪問它的全局訪問點。下面是一個簡單的實現:
1 class Singleton 2 { 3 private: 4 static Singleton* instance; 5 Singleton(){}; 6 public: 7 static Singleton* GetInstance() 8 { 9 return instance; 10 } 11 }; 12 13 Singleton* Singleton::instance = new Singleton();
七、STL有哪些組件,認識仿函數嗎
答:容器、算法、迭代器、仿函數、適配器和分配器。
仿函數行爲相似於函數,從實現的角度來看就是一種重載了operator()的class或class template。
八、重載有什麼特色
答:重載是一個類實現相同的機理,可是操做對象不一樣。主要特色是定義在同一類中,函數名相同,但參數列表不一樣,與返回值和virtual無關,與成員函數是不是const有關。
九、寫一個比較兩個數大小的template
1 template<class T> 2 const T compete(const T &a,const T &b) 3 { 4 if(a>=b) 5 return a; 6 else 7 return b; 8 }
十、一個空類有什麼
答:
1 class Empty {};//定義一個空類,相似定義下面這些 2 class Empty { 3 public: 4 Empty(){…} 5 Empty(const Empty& rhs){…} 6 ~Empty(){…} 7 Empty& operator=(const Empty& rhs){…} 8 };
十一、一個函數名後接一個const指代什麼,怎麼改變
答:一個const的成員函數,const修飾是this*指針也就是說,在函數中成員變量是const的,若是要修改能夠用關鍵字mutable修飾成員變量。
十二、求N之內的的全部質數
答:
1 vector<int> prime(int N) 2 { 3 vector<int> a; 4 if(N>=2) 5 { 6 a.push.back(2); 7 for(int i=2;i<=n;i++) 8 { 9 for(int j=2;j<i;j++) 10 { 11 if(i%j==0) 12 break; 13 if(j==i-1) 14 a.push_back(i); 15 } 16 17 } 18 } 19 return a; 20 } 21
1三、在一個類裏定義一個static成員函數與普通函數的區別
答:static成員函數只能被定義一次,同類的全部對象共享,也就是說一個類中只有一個實例,它表明的是類的一種行爲與對象實例無關。