下面的代碼輸出什麼?爲何?
#include <iostream> #include <malloc.h> using namespace std; class A { private: static int c_count; public: A() { c_count++; } ~A() { c_count--; } static void Count() { cout<<c_count<<endl; } }; int A::c_count = 0; int main() { A* a = static_cast<A*>(malloc(sizeof(A))); a->Count(); delete a; a->Count(); return 0; }
輸出:ios
0 -1
說明:編程
A* a = static_cast<A*>(malloc(sizeof(A))); // a 僅指向堆空間中A對象大小的內存, malloc 僅負責內存申請,不會觸發構造函數的調用 a->Count(); // 輸出 0 delete a; // 析構函數被調用 , 此時 a 成爲野指針 a->Count(); // 可是這裏爲何沒有運行崩潰呢? 由於,在C++中調用靜態成員時,只使用對象類型,而不使用具體的對象 a->Count(); ==> A::Count()
參考:
關於 new malloc free delete 的疑問segmentfault
下面的程序輸出什麼?爲何?
class A { public: virtual void test(int i) { cout<<"A::test"<<i<<endl; } void test() { cout<<"A::test"<<endl; } }; class B : public A { public: void test(double i) { cout<<"B::test"<<i<<endl; } }; int main() { A* a = new B(); B* b = new B(); a->test(5); b->test(5); return 0; }
輸出:編程語言
cout<<"A::test"<<5<<endl; // 注意這裏的輸出,沒有發生多態行爲 cout<<"B::test"<<5<<endl;
說明:函數
多態發生的條件:發生在派生類與基類之間;函數簽名必須徹底一致; 題目中派生類與基類的同名成員函數參數列表不一樣,僅發生同名隱藏
參考:
父子間的衝突spa
下面的描述正確的是?
A. 面向對象編程須要面嚮對象語言的支持,如Java 和 C++ 等 B. 封裝,繼承和多態是面向對象的基本特徵 C. 繼承是面向對象中代碼複用的惟一方式 D. 多態的工做方式與重載相同
答案: 【B】
說明:操作系統
A. 面向對象是軟件設計思想,與編程語言無關。面嚮對象語言僅是加入了對面向對象概念的原生支持 C. 繼承,組合 D. 重載,靜態聯編,編譯器肯定調用關係,發生在同一做用域中; 多態,動態聯編,運行時肯定調用關係,發生在有繼承關係的類之間
下面的代碼輸出什麼?爲何?
class A { private: int i; public: virtual void test() { cout<<"A::test"<<endl; } }; class B : public A { private: int i; public: void test() { cout<<"B::test"<<endl; } }; void f(A* p, int len) { for(int i=0; i<len; i++) { p[i].test(); } } int main() { B b[3]; f(b, 3); return 0; }
輸出:線程
cout<<"B::test"<<endl; 斷錯誤
說明:設計
1 .void test(); 將發生多態行爲,第一次打印正常輸出 2. 在題目的函數調用中,void f(A* p, int len);p 將指向子類對象 3. 指針運算時(編譯期肯定): Type t[N] t[i] <==> *(t + i) t + i <==> (unsigned int)t + i * sizeof(Type) 4. 指針 p 指向的類型爲 A,指針運算時的步長爲 sizeof(A) 5. class A 與 class B 爲繼承關係, 所以 sizeof(B) > Sizeof(A)
下面描述正確的是?
A. 一個應用程序啓動後成爲一個進程 B. 進程是操做系統資源分配的基本單位 C. 一個進程能夠建立多個線程,每一個線程都共享進程的資源 D. 操做系統能夠在建立進程的時候不建立任何一個線程
答案:【A B C】指針
下面程序輸出什麼?爲何?
class A { private: static int i; public: A() { i++; } A(const A&) { i++; } static void output() { cout<<i<<endl; } }; A f(A& a) { A aa = a; return a; } int A::i = 0; int main() { A a; f(a).output(); return 0; }
輸出:
i = 3
說明:
第一次 i++ : A a; 第二次 i++ : A aa = a; 第三次 i++ : return a; // a 初始化一個臨時對象用於返回
下面的程序輸出什麼?爲何?
#include <iostream> using namespace std; #define FUNC(a, b) a = a + b; \ b = a - b; \ a = a - b int main() { int a = 3; int b = 4; if(a > b) FUNC(a, b); cout<<a<<" "<<b<<endl; }
輸出:
4 -1
說明:
宏的反作用之一,僅進行簡單的文本替換 if(a > b) FUNC(a, b); ==> if(a > b) a = a + b; b = a - b; a = a - b
Telnet 協議是基於下面哪一種協議開發而來的?
A. TCP B. UDP C. TCP and UDP D. None of above
答案:【A】
Please choose the correct option for the ISR below:()
interrupt double service(double p) { return p*p; }
A. ISR function should not return any value, service() cannot be used as a ISR B. ISR function should not accept any parameter, service() cannot be used as a ISR C. Servica() is a valid ISR D. None of above
答案:【A B】
說明:
中斷服務程序須要遵循的規則: 1. 中斷服務程序不能有返回值 2. 中斷服務程序不能有參數 3. 中斷服務程序裏面不要有浮點運算 4. 中斷服務程序中不該有 printf 等不可重入的函數
有一組整型數,其中除了 2 個數字之外的其它數字都是倆倆成對出現的,編寫程序找出這兩個不成對出現的數字。
函數原型:void search_diff(int array[], int len, int* pa, int* pb);
示例:
void search_diff(int array[], int len, int* pa, int* pb); int a = 0; int b = 0; int array[] = {3, 4, 5, 5, 3, 4, 1, 6, 6, 7, 2, 8, 7, 8}; search_diff(array, sizeof(array)/sizeof(*array), &a, &b); //調用後 a,b 爲 1,2 或者 a,b 爲 2,1
int first_one_bit(unsigned int v) { int ret = 0; while( (v != 0) && ((v & 1) == 0) ) { v = v >> 1; ret ++; } return ret; } void search_diff(int array[], int len, int* pa, int* pb) { if( (array != NULL) && (pa != NULL) && (pb != NULL) ) { int r = 0; int flag = 0; for(int i=0; i<len; i++) { r = r ^ array[i]; } flag = 1 << first_one_bit(r); *pa = 0; *pb = 0; for(int i=0; i<len; i++) { if( array[i] & flag ) { *pa = *pa ^ array[i]; } else { *pb = *pb ^ array[i]; } } } }
打印一個 N * N 的矩陣,從首座標(0, 0) 開始順時針一次增大。
示例: 5 * 5矩陣,其中數字 1 的座標爲(0, 0) 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
template <int N> class SpinMatrix { private: int m_matrix[N][N]; struct Offset { int dx; int dy; }; bool isValid(int x, int y); public: SpinMatrix(); void run(); void println(); int scale(); }; template <int N> SpinMatrix<N>::SpinMatrix() { for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { m_matrix[i][j] = 0; } } } template <int N> bool SpinMatrix<N>::isValid(int x, int y) { bool ret = true; ret = ret && ((0 <= x) && (x < N)); ret = ret && ((0 <= y) && (y < N)); ret = ret && (m_matrix[x][y] == 0); return ret; } template <int N> void SpinMatrix<N>::run() { const Offset OFFSET[] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; const int OSLEN = sizeof(OFFSET) / sizeof (*OFFSET); int cx = 0; int cy = 0; int cd = 0; int i = 1; do { m_matrix[cx][cy] = i; if( !isValid(cx + OFFSET[cd].dx, cy + OFFSET[cd].dy) ) { cd = (cd + 1) % OSLEN; } cx += OFFSET[cd].dx; cy += OFFSET[cd].dy; i++; }while(i <= N*N); } template <int N> void SpinMatrix<N>::println() { for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { cout << m_matrix[i][j] << '\t'; } cout << endl; } cout << endl; } template <int N> int SpinMatrix<N>::scale() { return N; }