閱讀531 返回首頁    go 技術社區[雲棲]


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)

如果把析構函數標記為虛函數呢?
【解析】
c++編譯器一旦發現一個類型中有虛擬函數,就會為該類型生成虛擬函數表,並且在該類型的每一個實例中添加一個指向虛函數表的指針。
在32位機器上,一個指針占4個字節的空間,因此求sizeof得到4;如果在64位機器上,一個指針占8字節的空間,因此求sizeof則得到8

題目(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

  上一篇:go Java包及訪問控製權限--(private/default/protected/public)及命名規範
  下一篇:go nanosleep納秒級延遲