c++ 面試題(C/C++/STL)


1,智能指針:auto_ptr(c++11 已經棄用),unique_ptr(用於取代 auto_ptr),  shared_ptr,  weak_ptr

  http://www.cnblogs.com/TenosDoIt/p/3456704.html(值得一看)

  https://blog.csdn.net/zhourong0511/article/details/80315961(優缺點分析)

 1 // classTest.cpp : 定義控制台應用程序的入口點。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <string>
 7 #include <memory>
 8 
 9 using namespace std;
10 
11 class Test
12 {
13 public:
14     Test(string s);
15     ~Test();
16     string& getStr();
17     void setStr(string s);
18     void print();
19 
20 private:
21     string str;
22 };
23 
24 Test::Test(string s)
25 {
26     str = s;
27     cout << "Test creat" << endl;
28 }
29 Test::~Test()
30 {
31     cout << "Test delete:" << str << endl;
32 }
33 string& Test::getStr() {
34     return str;
35 }
36 void Test::setStr(string s) {
37     str = s;
38 }
39 void Test::print() {
40     cout << str << endl;
41 }
42 
43 // unique_ptr 使用
44 unique_ptr<Test> fun() {
45     return unique_ptr<Test>(new Test("789"));
46 }
47 
48 int _tmain(int argc, _TCHAR* argv[])
49 {
50     cout << "==========unique_ptr===========" << endl;
51 
52     unique_ptr<Test> ptest(new Test("123"));
53     unique_ptr<Test> ptest2(new Test("456"));
54     ptest->print();  // 123
55     ptest2 = move(ptest);  // ptest == null,ptest2 原內容釋放,ptest2 接管ptest
56     if (ptest == nullptr)
57         cout << "ptest == nullptr" << endl;
58     Test* p = ptest2.release(); // 可能有返回值,返回當前指向的內存空間
59     p->print(); // 
60     ptest.reset(p);
61     ptest->print();
62     ptest2 = fun();
63     ptest2->print();
64     cout << "===========shared_ptr===========" << endl;
65     shared_ptr<Test> sptest(new Test("123"));
66     shared_ptr<Test> sptest2(new Test("456"));
67     cout << sptest2->getStr()<< endl;
68     cout << sptest2.use_count() << endl;
69     sptest = sptest2; // "456"引用次數 +1,"123" 引用次數 -1(此時為 0 ,被銷毀)
70     sptest->print(); // 456
71     cout << sptest2.use_count()<< endl; // 此時引用數為2
72     cout << sptest.use_count() << endl;// 指向資源的引用數 為 2
73     sptest.reset(); //引用數 -1
74     sptest2.reset(); //引用數 -1 ,此時為 0 ,被銷毀
75     cout << "done" << endl;
76     system("pause");
77     return 0;
78 }
smart pointer

2,智能指針的不足和缺陷:

  https://www.zhihu.com/question/61008381

 3,C++11 新特性:

  http://www.cnblogs.com/George1994/p/6684989.html(值得一看)

4,虛繼承,虛函數表:

  https://www.cnblogs.com/fanzhidongyzby/archive/2013/01/14/2859064.html(值得一看)

5,C 內存模型:

  https://blog.csdn.net/anyaas/article/details/17099377

  C++ 內存模型:

  https://www.cnblogs.com/findumars/p/5929831.html?utm_source=itdadao&utm_medium=referral(值得一看)

 6,如果在一個函數內定義一個 static 對象,什么時候執行構造和析構函數,如果這個函數從沒被調用,會怎么被析構?

 1 #include <iostream>
 2 #include <string>
 3 #include <memory>
 4 
 5 using namespace std;
 6 
 7 class Test {
 8 public:
 9     Test() {
10         cout << "Constructor is executed" << endl;
11     }
12     ~Test() {
13         cout << "Destructor is executed" << endl;
14     }
15 };
16 
17 void myfunc() {
18     static Test obj;
19 }
20 
21 
22 int main()
23 {
24     cout << "main() starts" << endl;
25     myfunc();
26     cout << "main() terminates" << endl;
27 
28     system("pause");
29     return 0;
30 }
31 /* 輸出結果
32 main() starts
33 Constructor is executed
34 main() terminates
35 請按任意鍵繼續. . .
36 Destructor is executed 
37 */
static obj in function

分析:執行函數時,首先調用構造函數,但函數結束並不會調用析構函數,因為此對象 是 static 並不會被銷毀,可以看到,在主函數退出之后,執行了析構函數。

 1 #include <iostream>
 2 #include <string>
 3 #include <memory>
 4 
 5 using namespace std;
 6 
 7 class Test {
 8 public:
 9     Test() {
10         cout << "Constructor is executed" << endl;
11     }
12     ~Test() {
13         cout << "Destructor is executed" << endl;
14     }
15 };
16 
17 // 
18 void myfunc() {
19     static Test obj;
20 }
21 
22 
23 int main()
24 {
25     cout << "main() starts" << endl;
26 //    myfunc();                        // 並不調用函數 
27     cout << "main() terminates" << endl;
28 
29     system("pause");
30     return 0;
31 }
32 /* 輸出結果
33 main() starts
34 main() terminates
35 請按任意鍵繼續.
36 */
not invoke function

分析:當不調用函數時,構造函數和析構函數都不會執行(有點奇怪。)

7,C++ 11 左值和右值

  https://blog.csdn.net/chy19911123/article/details/46013499

8,STL 中容器的線程安全問題

  https://stackoverflow.com/questions/5912539/stl-map-find-thread-safe

 9,為什么不要在構造函數/析構函數中調用虛函數?

  https://blog.csdn.net/xiaoqi2008/article/details/39371191

10,malloc設計的系統調用?

  https://blog.csdn.net/Always__/article/details/50990838

11,構造函數為什么不能是虛函數?

  https://blog.csdn.net/jiadebin890724/article/details/7951520

12,內存對齊以及如何關閉內存對齊?

  https://blog.csdn.net/a1205137569/article/details/48968699

13,不用 static 怎么計數一個 const 函數被調用了幾次?(一般用 static,全局變量來進行計數)

  https://blog.csdn.net/sillyboard/article/details/594244(用了 mutable)

14,函數模板與類模板的區別?

  https://blog.csdn.net/tingzhushaohua/article/details/75331860

 15,C++構造函數參數列表與直接在構造函數中進行初始化有什么區別?

  https://www.zhihu.com/question/60546182

 16,const 和 define 的區別?

  https://blog.csdn.net/yi_ming_he/article/details/70405364

 17,類里面成員變量為什么不能用 memset() 來進行設置?會有什么問題?

  https://blog.csdn.net/sulongvc/article/details/6064013

 18,什么情況下函數里面的參數變量不一樣也能實現多態?

  還未得到合理解答。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM