c++筆試題彙總【2】

導讀:
  1. 以下三條輸出語句分別輸出什麼?
  char str1[] = "abc";
  char str2[] = "abc";
  const char str3[] = "abc";
  const char str4[] = "abc";
  const char* str5 = "abc";
  const char* str6 = "abc";
  cout <  cout <  cout <  答:分別輸出false,false,true。str1和str2都是字符數組,每個都有其自己的存儲區,它們的值則是各存儲區首地址,不等;str3和str4同上,只是按const語義,它們所指向的數據區不能修改。str5和str6並非數組而是字符指針,並不分配存儲區,其後的“abc”以常量形式存於靜態數據區,而它們自己僅是指向該區首地址的指針,相等。
  2. 以下代碼中的兩個sizeof用法有問題嗎?
  void UpperCase( char str[] ) // 將 str 中的小寫字母轉換成大寫字母
  {
  for( size_t i=0; i  if( 'a'<=str[i] &&str[i]<='z' )
  str[i] -= ('a'-'A' );
  }
  char str[] = "aBcDe";
  cout <<"str字符長度爲: " <  UpperCase( str );
  cout <  答:函數內的sizeof有問題。根據語法,sizeof如用於數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,因此其大小爲6,函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因此sizeof作用於上只將其當指針看,一個指針爲4個字節,因此返回4。
  3. 非C++內建型別 A 和 B,在哪幾種情況下B能隱式轉化爲A?
  答:
  a. class B : public A { ……} // B公有繼承自A,可以是間接繼承的
  b. class B { operator A( ); } // B實現了隱式轉化爲A的轉化
  c. class A { A( const B& ); } // A實現了non-explicit的參數爲B(可以有其他帶默認值的參數)構造函數
  d. A& operator= ( const A& ); // 賦值操作,雖不是正宗的隱式類型轉換,但也可以勉強算一個
  4. 以下代碼有什麼問題?
  struct Test
  {
  Test( int ) {}
  Test() {}
  void fun() {}
  };
  void main( void )
  {
  Test a(1);
  a.fun();
  Test b();
  b.fun();
  }
  答:變量b定義出錯。按默認構造函數定義對象,不需要加括號。
  5. 以下代碼有什麼問題?
  cout <<(true?1:"1") <  答:三元表達式“?:”問號後面的兩個操作數必須爲同一類型。
  6. 以下代碼能夠編譯通過嗎,爲什麼?
  unsigned int const size1 = 2;
  char str1[ size1 ];
  unsigned int temp = 0;
  cin >>temp;
  unsigned int const size2 = temp;
  char str2[ size2 ];
  答:str2定義出錯,size2非編譯器期間常量,而數組定義要求長度必須爲編譯期常量。
  7. 以下反向遍歷array數組的方法有什麼錯誤?
  vector array;
  array.push_back( 1 );
  array.push_back( 2 );
  array.push_back( 3 );
  for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍歷array數組
  {
  cout <  }
  答:首先數組定義有誤,應加上類型參數:vector  8. 以下代碼中的輸出語句輸出0嗎,爲什麼?
  struct CLS
  {
  int m_i;
  CLS( int i ) : m_i(i) {}
  CLS()
  {
  CLS(0);
  }
  };
  CLS obj;
  cout <  答:不能。在默認構造函數內部再調用帶參的構造函數屬用戶行爲而非編譯器行爲,亦即僅執行函數調用,而不會執行其後的初始化表達式。只有在生成對象時,初始化表達式纔會隨相應的構造函數一起調用。
  9. C++中的空類,默認產生哪些類成員函數?
  答:
  class Empty
  {
  public:
  Empty(); // 缺省構造函數
  Empty( const Empty& ); // 拷貝構造函數
  ~Empty(); // 析構函數
  Empty& operator=( const Empty& ); // 賦值運算符
  Empty* operator&(); // 取址運算符
  const Empty* operator&() const; // 取址運算符 const
  };
  10. 以下兩條輸出語句分別輸出什麼?
  float a = 1.0f;
  cout <<(int)a <  cout <<(int&)a <  cout <  float b = 0.0f;
  cout <<(int)b <  cout <<(int&)b <  cout <  答:分別輸出false和true。注意轉換的應用。(int)a實際上是以浮點數a爲參數構造了一個整型數,該整數的值是1,(int&)a則是告訴編譯器將a當作整數看(並沒有做任何實質上的轉換)。因爲1以整數形式存放和以浮點形式存放其內存數據是不一樣的,因此兩者不等。對b的兩種轉換意義同上,但是0的整數形式和浮點形式其內存數據是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。
  注意,程序的輸出會顯示(int&)a=1065353216,這個值是怎麼來的呢?前面已經說了,1以浮點數形式存放在內存中,按ieee754規定,其內容爲0x0000803F(已考慮字節反序)。這也就是a這個變量所佔據的內存單元的值。當(int&)a出現時,它相當於告訴它的上下文:“把這塊地址當做整數看待!不要管它原來是什麼。”這樣,內容0x0000803F按整數解釋,其值正好就是1065353216(十進制數)。
  通過查看彙編代碼可以證實“(int)a相當於重新構造了一個值等於a的整型數”之說,而(int&)的作用則僅僅是表達了一個類型信息,意義在於爲cout<<及==選擇正確的重載版本。
  11. 以下代碼有什麼問題?
  typedef vector IntArray;
  IntArray array;
  推薦投訴

本文轉自
http://blog.chinaunix.net/u/11234/showart_191144.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章