筆試整理之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[] 之類的過載了。
這樣程式碼基本上就定型了:
- #include <utility>
- #include <string.h>
- class String
- {
- public:
- String()
- : data_(newchar[1])
- {
- *data_ = '\0';
- }
- String(constchar* str)
- : data_(newchar[strlen(str) + 1])
- {
- strcpy(data_, str);
- }
- String(const String& rhs)
- : data_(newchar[rhs.size() + 1])
- {
- strcpy(data_, rhs.c_str());
- }
- /* Delegate constructor in C++11
- String(const String& rhs)
- : String(rhs.data_)
- {
- }
- */
- ~String()
- {
- delete[] data_;
- }
- /* Traditional:
- String& operator=(const String& rhs)
- {
- String tmp(rhs);
- swap(tmp);
- return *this;
- }
- */
- String& operator=(String rhs) // yes, pass-by-value
- {
- swap(rhs);
- return *this;
- }
- // C++ 11
- String(String&& rhs)
- : data_(rhs.data_)
- {
- rhs.data_ = nullptr;
- }
- String& operator=(String&& rhs)
- {
- swap(rhs);
- return *this;
- }
- // Accessors
- size_t size() const
- {
- return strlen(data_);
- }
- constchar* c_str() const
- {
- return data_;
- }
- void swap(String& rhs)
- {
- std::swap(data_, rhs.data_);
- }
- private:
- char* data_;
- };
注意程式碼的幾個要點:
- 只在建構函式裡呼叫 new char[],只在解構函式裡呼叫 delete[]。
- 賦值操作符采用了《C++程式設計規範》推薦的現代寫法。
- 每個函式都只有一兩行程式碼,沒有條件判斷。
- 解構函式不必檢查 data_ 是否為 NULL。
- 建構函式
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() {
c、c++ 基礎試題(2)
#include <stdio.h> int main() { char c; FILE *file; file = fopen("test.txt", "w+"); fprintf(file, "%c", 'a'); fprintf
c、c++ 基礎試題(3)
#include <stdio.h> struct s1 { int a : 1; int b : 1; }; struct s2 { int a : 20; int b : 12; }; struct s3 { i
c、c++ 基礎試題(1)
1、以下程式的輸出結果是什麼? main() { char *p1 = "name"; char *p2; p2 = (char*)malloc(20); memset(p2, 0, 20); while(*p2++ = *p1++); pr
Android之C面試題①高清載入巨圖方案,拒絕壓縮圖片(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++基礎班就業班全套