招銀科技2017 c++ 面試題
程式記憶體分佈,全域性變數、靜態變數的儲存位置
static修飾符作用
static全域性變數跟普通全域性變數區別,儲存方式有何區別c++設計一個單例模式,多執行緒環境下如何設計?用執行緒鎖是否會影響效能?有其他方案嗎介紹下c++ socket 模型, 建立tcp連線的步驟。多執行緒同步方式有哪些程序、執行緒的區別程序間有哪些通訊方式,各自優點是什麼。
拷貝建構函式引數為何必須為引用
筆試題量很大,可惜很多沒記住。大概講下有印象的考點:
資料庫方面考了很多,有很多我都沒聽過。
inner join,outer join,索引
軟體工程知識也不少,還有敏捷開發
32位機上編譯的 sizeof(char*),64位機子上輸出什麼?這題我覺得Linux上執行不了,win可以,但是我沒有32位機子,沒法測試,有人知道嗎?
異或運算
短小常用函式在c裡用什麼代替,c++裡用什麼代替
char* const p和char const * p的區別
這題說一個我的記憶方法:把*視為point to,然後從後往前讀,比如
char const * p就是p piont to a const char
char* const p就是p is const which point to a char
const char* p就是p point to a char which is const
所以char const * p和const char* p的意義是一樣的,p指向的記憶體不可變,char* const p的意義是p本身的值不可變。
建構函式內呼叫另一個建構函式
class A {
int m_age;
string m_name;
public:
A(const int& age){
A(age, "");
}
A(const int& age, const string& name) : m_name(name), m_age(age){}
};
在java等平臺支援語言中這種寫法比較常見,但在c++中語法是沒問題,但是結果肯定不是你想要的。
A(const int& age){
A(age, "");
}
在 A(const int& age)內呼叫A(age, ""),在棧上構造了另一個匿名A物件,然後函式返回,匿名物件被銷燬,然而當前物件成員卻沒有被初始化,成員值隨機。如果非要這樣寫來達到重用程式碼,可以這樣寫A(const int& age) { new (this)A(age, ""); }
c11及以上支援在初始化列表中呼叫另一個建構函式,不能寫在函式體內。如
class A {
int m_age;
string m_name;
public:
A(const int& age) : A(age, "") {}
A(const int& age, const string& name) : m_name(name), m_age(age){}
};
需要注意的是,被呼叫的建構函式必須完整初始化所有成員。所以A(const int& age) 可以呼叫A(const int& age, const string& name),而反過來不行。
程式設計題:
1. 實現單項鍊表反轉,只允許遍歷一次。
2. 兩個字串,實現判斷其中一個是不是另一個的子串,區分大小寫,同時還要寫test case
3. 傳入6個位元組長度的舊密碼、新密碼、再次輸入的新密碼三個字串指標,然後判斷是否符合以下規則:
新密碼不能跟舊密碼相同,兩次輸入的新密碼要相同,密碼為6位長度的數字的字元,新密碼不能是123456或654321這樣的有序數字或是666666這樣的同一個數字。
關鍵是這題程式碼只能在for迴圈裡裡填
int changePasswdIsOk(char* Old, char* New, char* New2) {
if (Old == NULL || New == NULL || New2 == NULL)
return 0;
for (int i = 0; i < 6; i++) {
}
}
本來看到這種題,一般會在迴圈外定義標誌位用來儲存上一次的狀態,然後與下次迴圈判斷結果相與,但是這題要求只能在迴圈內寫程式碼,當時是有一點點思路的,就是在迴圈內建立靜態標誌位,但是想著想著最後還是要在迴圈外判斷最終結果才能返回最終結果,時間又緊,下場面試的人已經在催了,就放棄了。回到家中還是沒啥思路,想百度也不知道搜什麼關鍵詞,後來又想了想,寫出來了:
bool changePasswdIsOk(const char Old[], const char New[], const char New2[]) {
if (Old == NULL || New == NULL || New2 == NULL)
return false;
for (int i = 0; i < 6; i++) {
static bool EachIsSame = true;
static bool isOrderedInc = true;
static bool isOrderedDec = true;
static bool isSameWithOld = true;
if (New[i] != New2[i])
return false;
if ('0' > New[i] || '9' < New[i])
return false;
if (isSameWithOld && New[i] != Old[i])
isSameWithOld = false;
if (i < 5) {
if (EachIsSame && New[i] != New[i + 1] )
EachIsSame = false;
if (isOrderedInc && New[i] != New[i + 1] - 1)
isOrderedInc = false;
if (isOrderedDec && New[i] != New[i + 1] + 1)
isOrderedDec = false;
}
else
return !(isSameWithOld || EachIsSame || isOrderedInc || isOrderedDec);
}
return true;
}
測了下都通過了。
上上週五去二面了,之前接到二面通知還挺高興的,還以為過了一面,結果好像去了一面的人都去二面了。然後所有崗位的就兩個面試官輪著面,其中一個還是HR。我還是第一次遇到這樣的,不知怎麼形容。
二面HR問我的核心賣點是什麼,問以前單位離職原因,問期望薪資。技術讓我挑一個最值得講的專案講,然後問我最大的難點在哪。後來問,有一個很大的檔案,比如一個G,要怎麼傳比較好。我說切成多片,多執行緒傳輸。他感覺不是很滿意。但也沒說應該怎麼傳。後來我問了幾個朋友,也都說會切片傳輸。算上那個可有可無的心理測試,等了快有一個半小時,然後面試十分鐘不到就灰溜溜的回去了,當然之後也沒後續了。