CVTE一面總結

一、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成員函數只能被定義一次,同類的全部對象共享,也就是說一個類中只有一個實例,它表明的是類的一種行爲與對象實例無關。

相關文章
相關標籤/搜索