最近在做牛客網上的c/c++的選擇題,鞏固一下語法知識,把錯的題總結一下。
當然不是所有都有總結,有明顯歧義的不管,過於簡單的不管(簡不簡單因人而異,我先閱讀了c++ primer後再開始做的練習,因此對於原書中重點強調過的知識會記憶更深刻,書中沒怎麼提到的知識就相對容易出錯)。
筆者的水平相當有限,錯誤會很多,懇請不吝時間指出。
(仍在更新中)
1. switch的本質
#include "stdio.h"
int main()
}printf("%d\n", c);
return 0;
}
以下程式的輸出結果是3。
解析:switch
的規則是
如果沒有匹配到case
又沒有default
則不執行。實際編碼中不應像上文這麼寫,如果有default
應該寫最後。
2. 只能內過載的運算子
下列關於賦值運算子「=」過載的敘述中,正確的是答案為a。解析:a. 賦值運算子只能作為類的成員函式過載
b. 預設的賦值運算子實現了「深層複製」功能
c. 過載的賦值運算子函式有兩個本類物件作為形參
d. 如果己經定義了複製拷貝建構函式,就不能過載賦值運算子
:: * . ?:
是特殊的不能過載的運算子,而更特殊一類運算子的是= () ->
,他們可以過載,但是必須過載在函式內部,不允許過載為外部友元函式,即class& operator=(class &x, class &y)
這樣的形式是不被允許的。
原因見此:csdn 關於有些運算子只能用成員函式過載
3. 常量字串的賦值
const char *p1 ="hello";
char *const p2 = "world";
給出以下定義,下列哪些操作是合法的?選a。解析:首先我們要理解頂層和底層const,a.
p1++;
b.
p1[2] = 'w';
c.
p2[2] = 'l';
d.
p2++;
const*
代表指標指向的值不能修改,*const
代表指標自身不能被修改,因此b和d錯誤。而乙個字面量字串其實是乙個常量字元陣列,被單獨存放在唯讀區,他雖然可以賦值給沒有頂層const
的指標,但是卻仍然不可修改,因此c錯誤。在實際測試中,c選項會給出警告,並在執行時發生錯誤。
4. 傳指標卻不修改值
#include #include void fun(int *p1, int *p2, int *s)
int main() , b[2] = , *s = a;
fun(a, b, s);
printf("%d \n", *s);
}
答案為1,不是11。雖然s作為傳入了函式,但s自己不是引用,仍是按值傳遞,因此改變的s,與main裡的s沒有關係。
主要是陰,實際應用中是不會出現這種情況的。
5. dynamic_cast的用法
struct a1
};struct a2
};struct b1 : a1, a2{};
int main()
a. l1語句編譯失敗,l2語句編譯通過選b。b. l1語句編譯通過,l2語句編譯失敗
c. l1,l2都編譯失敗
d. l1,l2都編譯通過
static_cast
用於普通的型別轉換,但是pb1是a1的指標,a1和a2之間沒有繼承關係,所以轉換不被允許。而dymamic_cast
是執行時轉換,一定可以通過編譯;在實際執行時,程式檢測pb1的實際型別(這裡是b1)能否通過繼承關係轉化為a2*(在這裡可以),若存在關係則轉換,否則返回空指標。
當然我們知道所有指標大小是一樣的,如果非要在編譯期轉換,可以使用c風格強制轉換a2* pb22 = (a2*)pb1
。
6. 區域性變數的引用
std::string& test_str()
int main()
區域性變數返回後即銷毀,這樣的寫法是不對的,但是實際上可以通過編譯,只會給出警告,並在執行期發生錯誤。c++秉承「相信程式設計師」的原則不做檢查,我們只能自己小心。
7. 友元宣告問題
#include #include using namespace std;
class point
public:
point(int x, int y) : x_(x), y_(y) /* ② */
private:
int x_;
int y_;
};int main(void)
請問程式會在哪個地方發生編譯錯誤?答案是不會。雖然distance定義在類中,但他不是成員函式,是乙個外部函式。
但是這道題有不合理的地方,友元宣告和宣告是不一樣的,首先來說一說規範寫法:
「友元宣告」只是表明友元關係,與外部的宣告是分離的。因此,一般來講,即使向上面一樣將定義放在友元宣告後,也需要在類外再宣告一次。
但是上面的**沒有這樣做,這是因為另乙個例外:如果這個函式的引數帶有這個類,則可以不用宣告。上例中distance帶有的point引數,如果把他改成空引數,就不再能通過編譯了。
實際程式設計中應該避免這種「例外」的發生。友元本就不屬於類,應該寫在外面;況且「不用宣告」這個特性並非標準,某些編譯器並不支援。
牛客網C 刷題
今天刷了些c 的題,就其中物件導向分享一下我的感悟。首先區分一下物件導向和面向過程 物件導向是首先抽象出各種物件 各種類 把資料和方法都封裝在物件中 類 然後各個物件之間發生相互作用。面向過程是將問題分解成若干步驟 動作 每個步驟 動作 用乙個函式來實現,在使用的時候,將資料傳遞給這些函式。stl有...
牛客網程式設計題
參考了排行榜大神 1.計算字串最後乙個單詞的長度,單詞以空格隔開 a raw input b a.split print len b 1 2.寫出乙個程式,接受乙個有字母和數字以及空格組成的字串,和乙個字元,然後輸出輸入字串中含有該字元的個數。不區分大小寫 a raw input lower b r...
牛客網 簡單題
給出乙個數學式子和兩個關係,知道其他所有數的值,求最後乙個的值 這道題目關鍵點有兩個 1.1.1.一開始的式子其實自然對數e ee的求值公式 2.2.2.對於題目要求的任意保留小數,我們可以用到c c c 中的ios iosios cout include include include inclu...