C++&C面試題100道分析(61-80)
61.字符指針、浮點數指針、以及函數指針這三種類型的變量哪個占用的內存最大?為什麽?
指針變量占有的空間是固定的,他和計算機操作系統的位數有關系。
62.構造函數可否是虛函數,為什麽?析構函數呢,可否是純虛的呢?
構造函數不可以是虛函數,構造函數的作用是申請內存空間,實例化類成為對象的,而虛函數存儲在虛函數表中,構造函數執行的時候還沒有空間,也沒有虛函數表。
析構函數可以是虛函數。
63.C++的空類,默認產生哪些類成員函數?(c++類中默認的一些方法)
class Empty
{
public:
Empty(); // 缺省構造函數
Empty ( const Empty& ) ; // 拷貝構造函數
~Empty(); // 虛構函數
Empty& operator(const Empty& ) // 賦值運算符
Empty& operator&(); // 取址運算符
const Empty* operator&() const; // 取址運算符 const
}
//缺省構造函數,缺省拷貝構造函數,缺省析構函數,對符號 = , & , * 的重載。
64.拷貝構造函數相關問題,深拷貝,淺拷貝等
拷貝構造分為淺拷貝和深拷貝,
所謂的淺拷貝就是僅僅拷貝地址,而不拷貝地址指向的內容。淺拷貝可能會在結束的時候對對象的空間二次釋放。
深拷貝就是拷貝地址指向的內容而不是簡單的拷貝地址。
65.下面的代碼是否有問題?
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
數組的長度必須在編譯時期就確定,常變量可以初始化
第二個str2並沒有確定長度,所以無法是錯誤的。
66.c++中那些函數不可以被聲明成為虛函數?
1.普通函數,虛函數是類中的函數,普通函數不可以被聲明。
2.構造函數,構造函數不能通過虛函數表來調用,他運行在虛函數表產生之前。
3.靜態函數,靜態函數不可以被繼承
4.友元函數,
67.當一個類 A 中沒有生命任何成員變量與成員函數, 這時 sizeof(A)的值是多少,請解釋一下編譯器為什麽沒有讓它為零。
為1;
需要區分不同的對象,需要設置虛函數指針。
68.以下代碼中的輸出語句輸出0 0 嗎,為什麽?
struct CLS{
int m_i;
CLS( int i ) : m_i(i) {}
CLS() {
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;
不會,考察初始化表的執行。
如果在默認構造函數中調用構造函數,只會執行函數體,而不會執行初始化表達式不會執行。
只有在類實例成對象的時候才會執行初始化表達式。
69.What are the values of a, b, and c after thefollowing instructions:
int a=5, b=7, c;
c = a+++b;
++的優先級高,而且執行的順序是從右向左,所以先讀取的是++,然後在執行++;
b = 7 , c = 12 , a = 6;
70.在排序方法中,關鍵碼比較次數與記錄地初始排列無關的是()
A. Shell 排序 B. 歸並排序
C. 直接插入排序 D. 選擇排序
D,
希爾排序:選擇位置是4,2,1的余數的排列。
歸並排序:8 , 4 ,2 , 1 ,逐漸的排序。
直接插入,從後面開始,向前移動,把數據插入到有序的隊列中
選擇排序,c++STL中algorithm中有sort可以對vector,string,dequeu
71.代碼 void func()
{
static int val;
…
}
void func()
{
static int val;
…
} 中,變量 val 的內存地址位於:
A. 已初始化數據段 B. 未初始化數據段
C.堆 堆 D.棧
答案:A,static修飾的變量,會被初始化,所以應該放在已經初始化的數據段。
數據段中還會存放全局變量
72.
class A {
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};
上面的代碼有什麽問題?
P指向的是this也就是對象自己,delet會調用自己的析構函數,這樣就會無限的循環下去。
73.寫出判斷 ABCD 四個表達式的是否正確, 若正確, 寫出經過表達式中 a 的值。
int a = 4;
(A)a += (a++); (B) a += (++a) ;
(C)(a++) += a; (D) (++a) += (a++);
A a = a + a ; a ++ a = 9
B a++ a = a+ a a = 10;
C,左側沒有可以賦值的變量
D a = 11
74.請你談談你是如何使用 return語句的。
return表明一個函數體的結束,一些內存的釋放。
return返回值的類型,有指針,引用,普通變量。
也要考慮效率
75.return String(s1 + s2); 和②String temp(s1 +s2);return temp;String temp(s1 +s2);return temp; 一樣嗎?
不一樣,第一條語句是返回了一個臨時的變量。
第二條語句是創建了一個局部變量,在函數結束的時候,這個局部變量還會被銷毀。
第一條語句建立的臨時變量會不需要被銷毀。
76.下列代碼執行的結果,理由?
inline void max_out( int val1, int val2 ) {
cout << ( val1 > val2 ) ? val1 : val2;
}
int main() {
int ix = 10, jx = 20;
cout << "The larger of " << ix;
cout << ", " << jx << " is ";
max_out( ix, jx );
cout << endl;
}
執行的結果是 The larger of 10, 20 is 0;
此處在cout語句中使用了三目運算符(條件選擇運算符),<< 的優先級比 ?: 的優先級要高,所以返回的是比較的結果。
77.下列語句算重載還是重復聲明
int max( int *ia, int sz );
int max( int *, int = 10 );
他們的區別是一個具有默認參數,一個沒有默認參數。
因為只有缺省時他們的參數列表才不一樣,所以他們不是重載,而是重復聲明了。
78.請編寫一個 C 函數,該函數給出一個字節中被置1 的位的個數。
int count(char tmp) { int count = 0; for(int i = 0 ; i < 8 ; i ++) { char ret = tmp & 0x01; tmp = tmp >> 1; if(ret) { count ++; } } return count; }
79.編程題
//編寫一個函數,函數接收一個字符串, , 是由十六進制數組成的一組字符串, ,函
//數的功能是把接到的這組字符串轉換成十進制數字函數的功能是把接到的這組字
//符串轉換成十進制數字. . 並將十進制數字返回。
int mun(int len) { int tmp = 1; for(int i = 0 ; i < len;i++) { tmp *= 16; } return tmp; } int HToD(string tmp) { //分割 int length = tmp.length(); int sum = 0; for(int i = 0 ; i < length; i++) { int tmp1 ; if(tmp[i] > 96) { tmp1 = tmp[i] - 87; } else if(tmp[i] > 64) { tmp1 = tmp[i] - 55; } else { tmp1 = tmp[i] - 48; } sum += mun(length-i-1) * tmp1; } return sum; }
80.輸入一個字符串,將其逆序後輸出 。
string reserve(string tmp) { int length = tmp.length(); for(int i = 0 ; i < length /2; i++) { char excharge; excharge = tmp[i]; tmp[i] = tmp[length - i -1 ]; tmp[length - i - 1] = excharge; } return tmp; }
C++&C面試題100道分析(61-80)