1.如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的?
【標准答案】
#ifdef __cplusplus
cout<<“c++";
#else
cout<<"c";
#endif
2. C和C++有什么不同?
【參考答案】
從機制上:
c是面向過程的(但c也可以編寫面向對象的程序);
c++是面向對象的,提供了類。但是,c++編寫面向對象的程序比c容易。
從適用的方向: c適合要求代碼體積小的,效率高的場合,如嵌入式; c++適合更上層的,復雜的; llinux核心大部分是c寫的,因為它是系統軟件,效率要求極高。
從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那為什么不叫c+而叫c++呢,是因為c++比 c來說擴充的東西太多了,所以就在c后面放上兩個+;於是就成了c++。
C語言是結構化編程語言,C++是面向對象編程語言。 C++側重於對象而不是過程,側重於類的設計而不是邏輯的設計。
關於這個問題,個人覺得《Effective C++》上面第一條說的很好,
View C++ as a federation of languages. 把C++當做一個語言聯邦。
C++由四部分組成
1> C語言部分;
2> 面向對象部分,包括封裝、繼承、多態這些C語言所沒有的特性;
3> 泛型編程部分,大多數類、函數要考慮到把它設計成模板,方便復用;
4> STL庫,里面封裝了大量的優秀模板,是 3> 中內容的集成, 學會使用它們可以讓代碼更高效。當然,最好去深入了解STL源碼,那樣會對C++有更深的理解。
3、STL容器
一、什么時候用STL
如果,有的時候,你要在程序中用到堆、棧、隊列、鏈表等一些基本的算法,而你又實在不想自己去實現數據結構教科書中那些繁瑣的算法,那么你就可以考慮使用STL。
另外,STL作為一種標准,便於交流,掌握它,一方面可以讓你寫的程序,易於讓別人理解,另一方面你也能夠比較容易地理解別人寫的程序。
二、什么是STL
全稱為 Standard Template Library ,即標准模板庫
要使用STL,要了解以下幾個基本概念:
- 容器:可以把它理解為存放數據的地方,常用的一些容器有 鏈表(list) 棧(stack) 動態數組 (vector) 雙端隊列(deque) 隊,列(queue) 映射(map)
- 迭代器:(iterator):可以把它理解為指針類型,STL中的許多函數需要用到它們作為參數
- 算法:它們通常需要與容器和游標配合使用,使用它們,你可以方便地對容器中的數據進行各種常見的操作,如排序操作,尋找最大元素的操作等
三、主要有以下的容器
- string
- vector
- list
- set / multiset
- map / multimap
- stack queue /
- priority_queue pair
- STL 算法 <algorithm> sort等
- 迭代器 iterator 、reverse_iterator
三、STL--使用
一、容器模板的使用 大致有下面6個步驟: 1.添加相應的頭文件(如 #include <list> )( 注意,沒有 .h ) 2.添加std命名空間(用 using namespace std; ) 3.賦予模板具體的使用類型(如 typedef list<string> LISTSTR; ) 4.實例化模板(如 LISTSTR test; ) 5.實例化游標(如 LISTSTR::iterator i; ) 6.通過迭代器對象訪問模板對象,例如 // 逐個輸出鏈表test中的元素 二、容器模板中的常用函數 assign() 賦值 empty() 容器為空則返回非0值 erase() 刪除指定位置或指定范圍內的元素 push_front() 從容器頭部插入元素 push_back() 從容器尾部插入元素 pop_front() 刪除第一個元素 pop_back() 刪除最后一個元素 back() 返回最后一個元素的引用 front() 返回第一個元素的引用 begin() 返回指向第一個元素的游標 (與迭代器配合使用) end() 返回指向最后一個元素的后一個位置的游標 (最后1個元素再加1) (與迭代器配合使用) |
4、“引用”與指針的區別是什么?
【參考答案】
指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作。
程序中使用指針,程序的可讀性差;而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。
在另一本C++著作《More Effective C++》里,第一條就是論述 point 和 reference的區別
總結一下 ,
1> 指針是一個存儲地址的變量,而引用是一個變量的別名。所以在一個函數中,傳引用要比傳指針速度更快。
2> 指針可以指向一個空值,而引用必須初始化。指針可以如下形式出現
int *p;
是合法但不合理的(相當於是一個野指針)。
可以聲明一個指向空值的指針
int *p=null
而引用不行
int &r;
是錯誤的
引用必須初始化為一個變量的別名,如
int a=5;
int &r=a;
3> 也是因為 2>的特性,指針在使用前要判斷是否為空,而引用必定不為空(否則會報錯),所以不用判斷。
4> 指針可以更改指向的內存地址,而引用是和變量綁定的,不可更改。
5> 在運算符重載過程中,通常返回一個引用往往比返回一個指針更好,使用指針易引起語義上的歧義。
5.C和C++中struct有什么區別?
1> C++中的struct類似於class,有變量,有構造函數、虛函數等,有繼承,多態等類的特征;
2> C中的struct只有變量,不能有函數,但是可以有函數指針
6.C++中的struct和class有什么區別?
在C++中,兩者區別不大,但是有2個主要的區別
1>. 繼承權限:struct默認是public繼承;class默認是private繼承
2>. 訪問權限:struct默認是public訪問;class默認是private訪問
7.int id[sizeof(unsigned long)];這個對嗎?為什么?
【標准答案】
正確
這個 sizeof是編譯時運算符,編譯時就確定了 可以看成和機器有關的常量。
8.某文件中定義的靜態全局變量(或稱靜態外部變量)其作用域是 ()?
A.只限某個函數 B.本文件 C.跨文件 D.不限制作用域
【參考答案】B。靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域局限於一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
9.C++函數中值的傳遞方式有哪幾種?
【標准答案】
C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞。
(指針傳遞就是通常說的地址傳遞)
10.對於一個頻繁使用的短小函數,在C語言中應用什么實現,在C++中應用什么實現?
【標准答案】c用宏定義,c++用inline
define實現的函數功能容易出bug,所以在c++中最好不要使用