531
技術社區[雲棲]
C++麵試若幹問題
題目(1)
定義一個空類型,裏麵沒有任何成員變量和成員函數,對該類型求sizeof,得到結果是()
A、 0 B、 1 C、 4 D、8
【解析】B
空類型的實例中不包含任何信息,本來求sizeof應該是0,但是當我們聲明該類型的實例的時候,它必須在內存中占有一定的空間,否則無法使用這些實例,至於占用多少內存,
由編譯器決定,Visual Studio中每個空類型的實例占用1個字節的空間。
#include <iostream> using namespace std; // 空類 class Fruits { }; // 繼承空類的空類 class Apple : public Fruits { }; // 空結構體 struct Sports { }; // 主函數 int main(int argc, char **argv) { cout<<"sizeof(Fruits):"<<sizeof(Fruits)<<endl; cout<<"sizeof(Apple):"<<sizeof(Apple)<<endl; cout<<"sizeof(Sports):"<<sizeof(Sports)<<endl; return 0; }

題目(2)
如果在該類型中添加一個構造函數和析構函數,在對該類型求sizeof,得到的結果是()
A、 0 B、 1 C、 4 D、8
【解析】B
調用構造函數和析構函數隻需要知道函數的地址即可,而這些函數的地址隻與類型有關,而與類型的實例無關,編譯器也不會因為這兩個函數而在實例內添加額外的信息。
題目(3)
題目(4)
下麵是C++語言中兩種if語句判斷方式。請問哪種寫法更好?為什麼?
// 主函數 int main() { int n; // 第一種判斷方式 if(n == 10) { } // 第二種判斷方式 if(10 == n) { } return 0; }
【解析】第二種
第二種方法如果少了個=號,編譯時就會報錯,減少了出錯的可能行,可以檢測出是否少了=
第一種不會報錯 會變為賦值語句
來源:劍指Offer(何海濤)
題目(5)
32位環境下,int *p=new int[10];請問sizeof(p)的值為()
A、4 B、10 C、40 D、8
【解析】A
指針就是一個地址值,在32位係統下,占用4個字節,
用sizeof求枚舉類型的長度,等於一個int型的長度,而與有幾個枚舉值無關.所以a也是占4個字節
來源:2014迅雷校園招聘
題目(6)
我們可以用static修飾一個類的成員函數,也可以用const修飾類的成員函數(寫在函數的最後表示不能修改成員變量,不是指寫在前麵表示返回值為常量)。請問:能不能同時用static和const修飾類的成員函數?
【解析】
答案是不可以。C++編譯器在實現const的成員函數的時候為了確保該函數不能修改類的實例的狀態,會在函數中添加一個隱式的參數const this*。但當一個成員為static的時候,該函數是沒有this指針的。也就是說此時static的用法和const是衝突的。
我們也可以這樣理解:兩者的語意是矛盾的。static的作用是表示該函數隻作用在類型的靜態變量上,與類的實例沒有關係;而const的作用是確保函數不能修改類的實例的狀態,與類型的靜態變量沒有關係。因此不能同時用它們。
來源:劍指Offer(何海濤)
題目(7)
#include<stdio.h> #include<string.h> int main() { char str1[] = "I love you"; char str2[] = "I love you"; char* str3 = "I love you"; char* str4 = "I love you"; if(str1 == str2){ printf("str1 and str2 are same.\n"); } else{ printf("str1 and str2 are not same.\n"); } if(str3 == str4){ printf("str3 and str4 are same.\n"); } else{ printf("str3 and str4 are not same.\n"); } if(strcmp(str1,str2) == 0){ printf("the value of str1 and str2 are same.\n"); } else{ printf("the value of str1 and str2 are not same.\n"); } return 0; }
【解析】
c/c++把敞亮字符串放到一個單獨的一個內存區域。當幾個指針賦值給相同的敞亮字符串時,他們實際上會指向相同的內存地址。但常量內存初始化數組,情況卻不一樣。
str1和str2是兩個字符串數組,我們會為他分配兩個長度為12個字節的空間,並把“I love you”的內容分別複製到數組中去。這是兩個初始化地址不同的數組。所以str1和str2是不相同的。
str3和str4是兩個指針,我們無需為他們分配內存以存儲字符串的內容,隻需要把他們指向“I love you”在內存中的地址就可以了。由於內容是常量字符串,他在內存中隻有一個拷貝,因此他們指向的是同一個地址。所以str3和str4是相同的。
strcmp()隻是判斷字符串中的內容(值)是不是一樣。
題目(8)變量的聲明與定義
變量的聲明和定義有什麼區別
【解析】
為變量分配地址和存儲空間的稱為定義,不分配地址的稱為聲明。
一個變量可以在多個地方聲明,但是隻在一個地方定義。
加入 extern 修飾的是變量的聲明,說明此變量將在文件以外或在文件後麵部分定義。
說明:很多時候一個變量,隻是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間,如外部變量。
題目(9)sizeof與strlen
請說明sizeof 和 strlen 的區別
【解析】
sizeof 和 strlen 有以下區別:
sizeof 是一個操作符,strlen 是庫函數。
sizeof 的參數可以是數據的類型,也可以是變量,而 strlen 隻能以結尾為‘\ 0‘的字符串作參數。
編譯器在編譯時就計算出了 sizeof 的結果。而 strlen 函數必須在運行時才能計算出來。並且 sizeof計算的是數據類型占內存的大小,而 strlen 計算的是字符串實際的長度。
數組做 sizeof 的參數不退化,傳遞給 strlen 就退化為指針了。
注意:有些是操作符看起來像是函數,而有些函數名看起來又像操作符,這類容易混淆的名稱一定
要加以區分,否則遇到數組名這類特殊數據類型作參數時就很容易出錯。最容易混淆為函數的操作符就是 sizeof。
最後更新:2017-04-03 14:53:40