1. 程式人生 > >筆試整理之C++基礎試題

筆試整理之C++基礎試題

1、i++跟++i

(1)單獨執行後,i的值都增加了1

(2)i++不可以做左值,++i可以

<1>左值:C/C++語言中可以放在賦值符號左邊的變數,即具有對應的可以由使用者訪問的儲存單元,並且能夠由使用者去改變其值的量。

<2>具體函式實現:

// 字首形式:

int& int::operator++() //這裡返回的是一個引用形式,就是說函式返回值也可以作為一個左值使用
{//函式本身無參,意味著是在自身空間內增加1的
  *this += 1;  // 增加
  return *this;  // 取回值
}

//字尾形式:
const int int::operator++(int) //函式返回值是一個非左值型的,與字首形式的差別所在。
{//函式帶參,說明有另外的空間開闢
  int oldValue = *this;  // 取回值
  ++(*this);  // 增加
  return oldValue;  // 返回被取回的值

}

2、C++ 的一個常見面試題是讓你實現一個 String 類,限於時間,不可能要求具備 std::string 的功能,但至少要求能正確管理資源。

此題轉載至:http://coolshell.cn/articles/10478.html

首先選擇資料成員,最簡單的 String 只有一個 char* 成員變數。

好處是容易實現,壞處是某些操作的複雜度較高(例如 size() 會是線性時間)。

為了面試時寫程式碼不出錯,本文設計的 String 只有一個 char* data_成員。

而且規定 invariant 如下:一個 valid 的 string 物件的 data_ 保證不為 NULL,data_ 以 '\0' 結尾,以方便配合 C 語言的 str*() 系列函式。
其次決定支援哪些操作,構造、析構、拷貝構造、賦值這幾樣是肯定要有的(以前合稱 big three,現在叫 copy control)。

如果鑽得深一點,C++11的移動構造和移動賦值也可以有。

為了突出重點,本文就不考慮 operator[] 之類的過載了。

這樣程式碼基本上就定型了:

  1. #include <utility>
  2. #include <string.h>
  3. class String 
  4.  public
  5.   String() 
  6.     : data_(newchar[1]) 
  7.   { 
  8.     *data_ = '\0'
  9.   } 
  10.   String(constchar* str) 
  11.     : data_(newchar[strlen(str) + 1]) 
  12.   { 
  13.     strcpy(data_, str); 
  14.   } 
  15.   String(const String& rhs) 
  16.     : data_(newchar[rhs.size() + 1]) 
  17.   { 
  18.     strcpy(data_, rhs.c_str()); 
  19.   } 
  20.   /* Delegate constructor in C++11 
  21.   String(const String& rhs) 
  22.     : String(rhs.data_) 
  23.   { 
  24.   } 
  25.   */
  26.   ~String() 
  27.   { 
  28.     delete[] data_; 
  29.   } 
  30.   /* Traditional: 
  31.   String& operator=(const String& rhs) 
  32.   { 
  33.     String tmp(rhs); 
  34.     swap(tmp); 
  35.     return *this; 
  36.   } 
  37.   */
  38.   String& operator=(String rhs) // yes, pass-by-value
  39.   { 
  40.     swap(rhs); 
  41.     return *this
  42.   } 
  43.   // C++ 11
  44.   String(String&& rhs) 
  45.     : data_(rhs.data_) 
  46.   { 
  47.     rhs.data_ = nullptr; 
  48.   } 
  49.   String& operator=(String&& rhs) 
  50.   { 
  51.     swap(rhs); 
  52.     return *this
  53.   } 
  54.   // Accessors
  55.   size_t size() const
  56.   { 
  57.     return strlen(data_); 
  58.   } 
  59.   constchar* c_str() const
  60.   { 
  61.     return data_; 
  62.   } 
  63.   void swap(String& rhs) 
  64.   { 
  65.     std::swap(data_, rhs.data_); 
  66.   } 
  67.  private
  68.   char* data_; 
  69. }; 

注意程式碼的幾個要點:

  1. 只在建構函式裡呼叫 new char[],只在解構函式裡呼叫 delete[]。
  2. 賦值操作符采用了《C++程式設計規範》推薦的現代寫法。
  3. 每個函式都只有一兩行程式碼,沒有條件判斷。
  4. 解構函式不必檢查 data_ 是否為 NULL。
  5. 建構函式 String(const char* str) 沒有檢查 str 的合法性,這是一個永無止境的爭論話題。這裡在初始化列表裡就用到了 str,因此在函式體內用 assert() 是無意義的。

這恐怕是最簡潔的 String 實現了。

練習1:增加 operator==、operator<、operator[] 等操作符過載。

練習2:實現一個帶 int size_; 成員的版本,以空間換時間。

練習3:受益於右值引用及移動語意,在 C++11 中對 String 實施直接插入排序的效能比C++98/03要高,試程式設計驗證之。(g++的標準庫也用到了此技術。)


3.描述在瀏覽器中敲入一個網址並按下回車後所發生的事情//比如 www.baidu.com

(1)DNS域名解析

首先要查詢域名的IP地址,經過DNS查詢後,將輸入網址域名轉換成IP地址。如果url裡不包含埠號,則會使用該協議的預設埠號。DNS域名解析的過程是這樣的:首先我們知道我們本地的機器上在配置網路時都會填寫DNS,這樣本機就會把這個url發給這個配置的DNS伺服器,如果能夠找到相應的url則返回其ip,否則該DNS將繼續將該解析請求傳送給上級DNS,整個DNS可以看做是一個樹狀結構,該請求將一直髮送到根直到得到結果。

(2)在傳送請求前,先要建立一個TCP連線(socket連線)。socket通過ip和埠建立的,現在有了目標ip和埠號。

(3)建立連線後傳送請求。瀏覽器給web伺服器傳送一個HTTP請求。請求中也包含瀏覽器儲存的該域名的cookies。cookies是與跟蹤一個網站狀態相匹配的鍵值。cookies會儲存登入使用者名稱,伺服器分配的密碼和一些使用者設定等。Cookies會以文字文件形式儲存在客戶機裡,每次請求時傳送給伺服器。

(3)服務的永久重定向響應
(4)瀏覽器跟蹤重定向地址
(5)伺服器“處理”請求:應答 web伺服器收到請求,進行處理。 從它的文件空間中搜索子目錄index.html。如果找到該檔案,Web伺服器把該檔案內容傳送給相應的Web瀏覽器;未找到,返回錯誤資訊。為了告知瀏覽器,Web伺服器首先傳送一些HTTP頭資訊,然後傳送具體內容(即HTTP體資訊),HTTP頭資訊和HTTP體資訊之間用一個空行分開
(6)伺服器發回一個HTML響應

(7)釋放 TCP 連線:若connection 模式為close,則伺服器主動關閉TCP 連線,客戶端被動關閉連線,釋放TCP 連線;若connection 模式為keepalive,則該連線會保持一段時間,在該時間內可以繼續接收請求
(8)瀏覽器開始顯示HTML
(9)瀏覽器傳送獲取嵌入在HTML中的物件

參考網址:http://www.mamicode.com/info-detail-1357508.html

4.strcpy和memcpy的區別 ()

strcpy和memcpy都是標準C庫函式,它們有下面的特點。
strcpy提供了字串的複製。即strcpy只用於字串複製,並且它不僅複製字串內容之外,還會複製字串的結束符。

已知strcpy函式的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般記憶體的複製。即memcpy對於需要複製的內容沒有限制,因此用途更廣。
void *memcpy( void *dest, const void *src, size_t count );

char * strcpy(char * dest, const char * src) // 實現src到dest的複製
{
  if ((src == NULL) || (dest == NULL)) //判斷引數src和dest的有效性
  {
      return NULL;
  }
  char *strdest = dest;        //儲存目標字串的首地址

  while ((*strDest++ = *strSrc++)!='\0'); //把src字串的內容複製到dest下

  return strdest;
}


void *memcpy(void *memTo, const void *memFrom, size_t size)
{
  if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效
         return NULL;

  char *tempFrom = (char *)memFrom;             //儲存memFrom首地址
  char *tempTo = (char *)memTo;                  //儲存memTo首地址      
  while((size-- )> 0)                //迴圈size次,複製memFrom的值到memTo中
         *tempTo++ = *tempFrom++ ;  
  return memTo;



strcpy和memcpy主要有以下3方面的區別。
1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。
3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

相關推薦

筆試整理C++基礎試題

1、i++跟++i (1)單獨執行後,i的值都增加了1 (2)i++不可以做左值,++i可以 <1>左值:C/C++語言中可以放在賦值符號左邊的變數,即具有對應的可以由使用者訪問的儲存單

.Net基礎C#基礎

(一)C#註釋符 與C++相似,可以使用以下三種方式: 1、/**/ 2、// 3、/// (二)C#中的常用快捷鍵(VS2010) Ctrl + K + D : 快速對齊程式碼 Ctrl + J :快速彈出智慧提示 Home : 游標移至行首 End :游標移至行尾 Sh

搜狗2013年校園招聘研發類筆試試卷C/C++類

#include <iostream> using namespace std; class Base { public: Base(int j) : i(j) {} virtual ~Base() {} void func1() {

cc++ 基礎試題(2)

#include <stdio.h> int main() { char c; FILE *file; file = fopen("test.txt", "w+"); fprintf(file, "%c", 'a'); fprintf

cc++ 基礎試題(3)

#include <stdio.h> struct s1 { int a : 1; int b : 1; }; struct s2 { int a : 20; int b : 12; }; struct s3 { i

cc++ 基礎試題(1)

1、以下程式的輸出結果是什麼? main() { char *p1 = "name"; char *p2; p2 = (char*)malloc(20); memset(p2, 0, 20); while(*p2++ = *p1++); pr

AndroidC試題①高清載入巨圖方案,拒絕壓縮圖片(BitmapRegionDecoder)

一、概述    對於載入圖片,大家都不陌生,一般為了儘可能避免OOM都會按照如下做法:對於圖片顯示:根據需要顯示圖片控制元件的大小對圖片進行壓縮顯示。如果圖片數量非常多:則會使用LruCache等快取機制,將所有圖片佔據的內容維持在一個範圍內。其實對於圖片載入還有種情況,就是

VsCode 外掛整理C#

在VsCode 中編寫C#程式碼的常用外掛整理 一、C# FixFormat程式碼格式化工具 注: 1.FixFormat外掛的格式化後樣式和JavaScript,Java等編輯器的程式碼樣式相同。 2.從VsCode v14.1開始已經開始支援C#程式碼格式化,不需要外掛

分類整理I 微軟等100題系列V0 1版 c/c++基礎試題集錦

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

8.C#基礎語句(在整理當中)

  8.1結束點和可到達性      在介紹各個語句之前先說一下結束點和可到達性的概念,因為每個語句都有一個結束點,就是緊跟在語句後面的那個位置,到達結束點時,控制就轉移到該塊中的下一個語句;執行流程可能到達的語句稱為該語句是可到達的,反之是不可到達的。比如:

18.C#基礎不安全程式碼(在整理當中)

     前面有寫到過,核心C#語言沒有將指標引入它所支援的資料型別,從而與C和C++有著顯著的區別。作為代替,C#提供了各種引用型別,並能建立可由垃圾回收器管理的物件。這就使得C#比C或C++安全的多。      在核心C#語言中,乾脆就不可能有

c++基礎要點整理(一)——內部類

一. 內部類的定義       包含在一個類裡面都類稱為內部類,其定義形式為: class A { public: class InClass { void funcB

金山(Kingsoft)筆試試題整理004

題目1:將一個N進位制數轉換成M進位制數 /*還有bug,暫時存檔*/ /*******************************************/ /*將一個n進位制的數轉換成m進位制的數,並輸出. 在10進位制以上的數中A代表10,B代表11,以此類推。

C#基礎析構函數

bsp alt 基礎 ges -1 c# ima log images C#基礎之析構函數

菜鳥系列C/C++經典試題(三)

最小 新元素 一道 數據 步驟 時間 name val type 設計包括min函數的棧 題目:定義棧的數據結構,要求加入一個min函數,可以得到棧的最小元素。要求函數min、push以及pop的時間復雜度都是O(1)。 分析:這是2006年google的一道面試題。

C#基礎知識-面向對象思想繼承(八)

添加 電視劇 一中 一段 public bsp 更多 cnblogs tin 上一篇的標題編程思想我覺得不是很符合主題,因為編程思想的範圍太大了,不僅僅是封裝 繼承 多態,所以比較符合主題的應該是面向對象思想。這一篇中將繼續敘述面向對象思想中的繼承。 從字面來看繼承表達的意

基礎知識 - C# Using的用法

spa 方案 image acl 決定 ogr 托管 sid 引入 C#裏面Using有兩種用法: 1.作為指令。 using+命名空間,導入其他命名空間中定義的類型,這樣可以在程序中直接用命名空間中的類型,不必指定命名空間; 命名空間是.NET程序在邏輯上

菜鳥系列C/C++經典試題(五)

span data- 復雜 joseph 暫時 color current sep mod 求圓圈中剩下的最後一個數字 題目:n個數字(0,1,…,n-1)形成一個圓圈,從數字0開始。每次從這個圓圈中刪除第m個數字(第一個為當前數字本身。第二個為當前數字的下一個數

【前端小小白的學習路】整理幾道面試題(HTTP協議)【轉】

ase 賬號 檢測 提交數據 大型數據集 tor 添加 描述 分享 轉自:http://www.cnblogs.com/ranyonsue/p/5984001.html HTTP簡介 HTTP協議是Hyper Text Transfer Protocol(超文本傳輸

2016最新整理傳智播客第15期C,C++基礎班就業班全套

c++ c語言培訓教材 傳智播客c++推薦優秀課程,畢業就業首選C++培訓課程視頻地址:http://blog.sina.com.cn/s/blog_1706603600102wxlb.html傳智播客C++第15期2016最新整理傳智播客第15期C,C++基礎班就業班全套