1. 首頁
  2. 面試

C++基礎面試題

C++基礎面試題

1,以下程式碼中的兩個sizeof用法有問題嗎?

sizeof如用於陣列,只能測出靜態陣列的大小,無法檢測動態分配的或外部陣列大小。注意:陣列名作為函式引數時,退化為指標。陣列名作為sizeof()引數時,陣列名不退化,因為sizeof不是函式。

請問以下程式碼有什麼問題

int main()

{

char a;

char *str = &a;

strcpy(str,”hello”);

printf(str);

return 0;

}

沒有為str分配記憶體空間,將會發生異常

問題出在將一個字串複製進一個字元變數指標所指地址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程式崩潰。

Strcpy的在庫函式string.h中,程式的主要程式在於越辦進行記憶體讀寫導致程式崩潰。

2,const char* s = “AAA”;

Printf(“%s”,s);

S[0] = ‘B’;

Printf(“%s”,s);

“AAA”是字串常量,S是指標,指向這個字串常量,所以宣告s的時候就有問題。

Const char* s =”AAA”,然後又因為是常量,所以對S[0]的賦值操作是不合法的。

3,Char szstr[10];

Strcpy(szstr,”0123456789″);

產生什麼結果?為什麼?

正常輸出,長度不一樣,會造成非法的OS,覆蓋別的內容

4,交換兩個變數的值,不使用第三個變數。即a=3,b=5,交換之後a=5,b=3;

兩種解法,一種是用算術演算法,一種是用^(異或)

a = a+b;

b = a-b;

a = a-b;

or

a = a^b;//只能對int ,char

b = a^b;

a = a^b;

or

a ^= b ^=a;

5,指出下面程式碼的輸出,並解釋為什麼

main()

{

int a[5] = {1,2,3,4,5};

int *ptr = (int *)(&a+1);

printf(“%d,%d”,*(a+1),*(ptr-1));

}

輸出:2,5

6,將”引用”作為函式返回值型別的格式、好處和需要遵守的規則

格式:型別識別符號 &函式名(形參列表及型別說明){//函式體}

格式:在記憶體中不產生被返回值的副本:(注意:正是因為這點原因,所以返回一個區域性變數的引用是不可取的。因為隨著該區域性變數生存期的結束,相應的引用也會失效。)

注意事項:

不能返回區域性變數的引用。主要原因是區域性變數會在函式返回時被銷燬,因此被返回的引用就成為了”無所指的”引用,程式會進入未知狀態。

不能返回函式內部new分配的記憶體的引用。雖然不存在區域性變數的被動銷燬問題,可對於這種情況(返回函式內部new分配記憶體的引用),又面臨其它尷尬的局面。如,被函式返回的引用只是作為一個臨時變量出現,而沒有被賦予一個實際的'變數,那麼這個引用所指向的空間(由new分配)就無法釋放。

可以返回類成員的引用,但最好是const。主要原因是當物件的屬性是與某種業務規則相關聯時,其賦值常常與某些其它屬性或者物件的狀態有關,因此有必要將賦值操作封裝在一個業務規則當中。如果其它物件可以獲得該屬性的非常量引用(或指標),那麼對該屬性的單純賦值就會破壞業務規則的完整性。

多型的作用:

隱藏實現細節,使得程式碼能夠模組化;擴充套件程式碼模組,實現程式碼重用;

介面重用:為了類在繼承和派生的時候,保證使用家庭中任一類的例項的某一屬性時的正確呼叫。

精彩文章推薦: