複試---C++

1.內聯函數與宏定義:

宏定義預處理階段簡單直接替換:比如#define max(a,b) a>b?a:b;如果使用 max(a++,b) 會產生歧義:a++ >b?a++:b;a自增兩次。

解決宏定義產生的歧義:內聯函數/內置函數

inline int max(int a,int b){
	a>b?a:b
}

會直接替換函數調用的代碼,產生很多複製,不如函數調用好。

plus:程序編譯:
1) 預處理:程序展開和替換。.h文件展開到#include中,以及宏替換等,但不做運算功能。
2) 編譯:高級語言編譯成彙編語言,程序-》目標模塊
3) 鏈接:目標模塊和庫函數鏈接,形成裝入模塊。
4) 裝入:最終模塊裝入內存

2. 三大特性:封裝繼承多態。

封裝:實現高內聚,低耦合,模塊化,更容易維護。
多態:1.繼承 2 重寫 3.父類引用指向子類對象(Object obj = new Cat())

3. 重載:

函數名同,參數不同。區別重寫。

4. 重寫(多態):父類某個函數加了virtual(父類爲虛函數),子類定義完全一致的函數。

虛函數於純虛函數是由區別的:虛函數需要加上代碼定義,純虛函數不需要,如果存在純虛函數是抽象類,只能繼承。
當基類產生繼承和多態時,基類的析構函數爲虛函數。不然在父類指針指向子類對象時,delete只會調用父類而不會調用子類。

5. struct、class區別:

struct:成員默認public;class:默認private。
class和可以定義模板參數,但是struct不支持。

6.泛型算法algorithm
replace:將vec中的0都替換成22
replace(vec.begin(),vec.end(),0,22); 

lambda:[(&引用)變量](形參) -> return type{};

[ ]裏面是這個函數需要捕獲局部變量、(這個局部變量在之前有定義)()是這個函數的形參,接下來是返回類型,函數體部分。

7. 複製構造函數

構造函數的一種,只有一個參數(本類的引用)。可以時const(常用), 也可以非const。
作用:使用一個已經存在的對象取初始化同類的一個新對象。
調用情況:1.類的一個對象去初始化(僅初始化) 該類的裏那個一個對象;A b(a); A b=a; 兩條等價2.函數的形參爲類的對象;3.函數的返回值是類的對象。
默認的複製構造函數:元素的對應複製,兩個對象指向同一個地址內存。(淺複製:動態釋放內存時,內存泄漏,因爲釋放了兩次)A a; A b(a);
淺複製:如果要確保實參的值不會改變,又希望避免複製構造函數帶來的開銷,解決辦法就是將形參聲明爲對象的 const 引用。
自定義複製構造函數:深複製,拷貝構造函數需要建立一個新對象
構造函數可以被重載,析構函數有且只有一個,且沒有參數,不可以被重載。

class A{
public:
	type t1,t2;
	A(type _t1,type _t2){
		t1=_t1;
		t2=_t2;
	}
	A(const A& a){ // 深複製 const更好:可以接收常量對象
		t1=a.t1;
		t2=a.t2;
	}
}
8.const:“常”

char* :“讀、寫”權限;const char* :“只讀”權限“

const 與 指針變量
const離變量名 近 修飾指針變量 p1,p2。
const裏變量名 遠 修飾指針指向的數據。

1.const離變量名 近
const int *p1;
int const *p2; // p1\p2可以修改指向不同的數據,但其數據並能被修改。

2.const離變量名 遠
int* const p; //指針只讀,p不能被修改

const 與 函數形參
形參若是指針,可防止函數內部修改指針指向的數據。比如size_t strlen(const char* str)-(查找字符串長度)。
作用:防止誤操作修改變量;提示用戶函數不會修改提供的變量。
const:修飾成員變量和成員函數,變成類型,數據不再被修改。
const char* get() 返回值時不能被修改的const類型。
char* get() const "只讀"取成員變量的值,而不能修改。


1.new,delete ; malloc,free;
分別爲兩對:new-delete 有構造析構函數;malloc-free沒有
2. 引用:
引用作爲形參不需要分配存儲空間,(提高程序效率)。如果又不希望變量在函數內部改變,加const。
3.C++內存區域:
(delete、free釋放)堆區:new,malloc開闢的
(函數結束釋放)棧區:局部變量
(程序退出釋放)靜態存儲區:全局變量
局部變量會屏蔽全局變量,如果需要在同名的情況下使用全局變量,需要使用域運算符(::)。
4.指針數組與數組指針:
數組指針(行|組指針) int (*p)[n], ()優先級高,說明p是指針,指向一個整型的長度爲n的一維數組。p+1時,p跨過n個元素。
優先級:()>[]>\*
指針數組:是數組 int *p[n],存儲指針的數組。數組名爲p,數組長度爲n。有n個指向int類型數據的指針。
int (*)[10] p2; int (*)[10]是指針類型,p2 是指針變量。
5.指針的幾種情況
int* p[n]:指針數組,一共n個元素,每個元素均爲指向整型數據的指針.
int (*p)[n]:數組指針,p爲一個指針,指向一維數組,這個數組有n個整形數據。
int* p():指針函數,p指向函數的返回值。
int (*p)(): 函數指針,p爲指向函數的指針。
6.代碼識別:

int * ( * (*fp1)(void *))[10];   //1

()優先級 (*fp1) fp1爲指針,指向一個函數。
(void *)爲指針函數,返回值也是指針,參數爲void。fp1爲指向指針函數的函數指針。
int* P[10] 數組,P函數返回值也是指針,指針數組。
綜合:fp1 是指針指針函數的函數指針,並且函數指針的返回值是 長度爲10的 指針數組。
7.結構和聯合:
同一時刻,聯合中值存放了一個被選中的成員,而結構的所有成員都存在。
對於聯合的不同成員賦值,將會對其他成員進行重寫,原來成員的值就不存在了,對於結構的不同成員賦值是不影響的。
8.對指針的理解
指針是一個變量,指向一塊內存地址,指針的類型取決於指針指向的類型,其也可以訪問其指向的內存地址。
9.缺省函數
默認構造函數 拷貝構造函數 析構函數 賦值函數
10.switch,c++不是安全的以及傳遞方式
switch()內的不能爲浮點型,必須爲整型或者枚舉型。
C++不是安全的,因此兩個不同類型的指針可以進行強制轉換。
C++值的傳遞方式:值傳遞 指針傳遞 引用傳遞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章