1. 程式人生 > >經典基礎C++筆試題2(附答案)

經典基礎C++筆試題2(附答案)

1. C中static有什麼作用?

(1)隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。

2static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數。

3static的第三個作用是預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。

2.C++中const有什麼用?

不要一聽到const就說是常量, 這樣給考官一種在和一個外行交談的感覺。應該說const修飾的內容不可改變就行了, 定義常量只是一種使用方式而已,還有const資料成員,const引數, const返回值, const成員函式等,const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性

3. C與C++各自是如何定義常量的?有什麼不同?

C中是使用巨集#define定義, C++使用更好的const來定義。

區別:1)const是有資料型別的常量,而巨集常量沒有,編譯器可以對前者進行靜態型別安全檢查,對後者僅是字元替換,沒有型別安全檢查,而且在字元替換時可能會產生意料不到的錯誤(邊際效應)。2)有些編譯器可以對const常量進行除錯, 不能對巨集除錯。

4. 既然C++中有更好的const為什麼還要使用巨集?

const無法代替巨集作為衛哨來防止檔案的重複包含

5. C++中引用和指標的區別?

引用是物件的別名, 操作引用就是操作這個物件, 必須在建立的同時有效得初始化(引用一個有效的物件, 不可為NULL), 初始化完畢就再也不可改變, 引用具有指標的效率, 又具有變數使用的方便性和直觀性, 在語言層面上引用和物件的用法一樣, 在二進位制層面上引用一般都是通過指標來實現的, 只是編譯器幫我們完成了轉換. 之所以使用引用是為了用適當的工具做恰如其分的事, 體現了最小特權原則.

6. 說一說C與C++的記憶體分配方式?

1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在,如全域性變數,static

變數。2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。3)從堆上分配(動態記憶體分配)程式在執行的時候用mallocnew申請任意多少的記憶體,程式設計師負責在何時用freedelete釋放記憶體。動態記憶體的生存期自己決定,使用非常靈活。

7. new/delete 與 malloc()/free() 的區別?

malloc() 與 free() 是C語言的標準庫函式, new/delete 是C++的運算子, 他們都可以用來申請和釋放記憶體, malloc()和free()不在編譯器控制權限之內, 不能把建構函式和解構函式的任務強加給他們.

8. #include<a.h>和#include“a.h” 有什麼區別?

答:對於#include <a.h> ,編譯器從標準庫路徑開始搜尋 a.h對於#include a.h ,編譯器從使用者的工作路徑開始搜尋 a.h

9. 在C++ 程式中呼叫被 C編譯器編譯後的函式,為什麼要加 extern “C”?

C++語言支援函式過載,C語言不支援函式過載。函式被C++編譯後在庫中的名字與C語言的不同。假設某個函式的原型為: void foo(int x, int y);該函式被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。C++提供了C連線交換指定符號extern“C”來解決名字匹配問題

10. C++中的什麼是多型性? 是如何實現的?

多型性是面向物件程式設計語言繼資料抽象和繼承之後的第三個基本特徵。它是在執行時出現的多型性通過派生類和虛擬函式實現。基類和派生類中使用同樣的函式名, 完成不同的操作具體實現相隔離的另一類介面,即把“ w h a t”從“h o w”分離開來。多型性提高了程式碼的組織性和可讀性,虛擬函式則根據型別的不同來進行不同的隔離。

11. 什麼是動態特性?

在絕大多數情況下, 程式的功能是在編譯的時候就確定下來的, 我們稱之為靜態特性. 反之, 如果程式的功能是在執行時刻才能確定下來的, 則稱之為動態特性。C++中, 虛擬函式,抽象基類, 動態繫結和多型構成了出色的動態特性。

12.什麼是封裝?C++中是如何實現的?

封裝來源於資訊隱藏的設計理念, 是通過特性和行為的組合來建立新資料型別讓介面與具體實現相隔離。C++中是通過類來實現的, 為了儘量避免某個模組的行為干擾同一系統中的其它模組,應該讓模組僅僅公開必須讓外界知道的介面.

13. 什麼是RTTI?

RTTI是指執行時型別識別(Run-time type identification)在只有一個指向基類的指標或引用時確定一個物件的準確型別

14. 什麼是拷貝建構函式?

它是單個引數的建構函式,其引數是與它同屬一類的物件的(常)引用;類定義中,如果未提供自己的拷貝建構函式,C++提供一個預設拷貝建構函式,該預設拷貝建構函式完成一個成員到一個成員的拷貝

15. 什麼是深淺拷貝?

淺拷貝是建立了一個物件用一個現成的物件初始化它的時候只是複製了成員(簡單賦值)而沒有拷貝分配給成員的資源(如給其指標變數成員分配了動態記憶體); 深拷貝是當一個物件建立時,如果分配了資源,就需要定義自己的拷貝建構函式,使之不但拷貝成員也拷貝分配給它的資源.

16.面向物件程式設計的優點?

開發時間短, 效率高, 可靠性高。面向物件程式設計的編碼具有高可重用性,可以在應用程式中大量採用成熟的類庫(如STL,從而雖短了開發時間,軟體易於維護和升級。

17。 請指出函式程式碼全域性變數區域性變數,函式形參new出來的變數各自的記憶體分佈。

       棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。 


  堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個new就要對應一個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動回收。 
  自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。 
  全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的C語言中,全域性變數又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同佔用同一塊記憶體區。 

       函式程式碼存放於程式碼區。
  常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多,在《const的思考》一文中,我給出了6種方法)

18. 什麼是平衡二叉樹? 

左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大於

19. 堆疊溢位一般是由什麼原因導致的? 

沒有回收垃圾資源 

20. 什麼函式不能宣告為虛擬函式(Runtime的時候才知道呼叫哪個函式,編譯時不能確定)? 

建構函式和行內函數 

21氣泡排序演算法的時間複雜度是什麼? 

O(n^2) 

22、如何引用一個已經定義過的全域性變數? 

答:extern 可以用引用標頭檔案的方式,也可以用extern關鍵字,如果用引用標頭檔案方式來引用某個在 標頭檔案中宣告的全域性變,假定你將那個變數寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連線期間報錯

23、全域性變數可不可以定義在可被多個.C檔案包含的標頭檔案中?為什麼? 

答:可以,在不同的C檔案中以static形式來宣告同名全域性變數。 可以在不同的C檔案中宣告同名的全域性變數,前提是其中只能有一個C檔案中對此變數賦初值,此時連線不會出錯 

24、語句for( ;1 ;)有什麼問題?它是什麼意思? 

答:和while(1)相同。 

25.對於一個頻繁使用的短小函式,C語言中應用什麼實現,C++中應用什麼實現

c用巨集定義,c++inline 

26. 請寫出下列程式碼的輸出內容 

#include<stdio.h> 
main() 
{ 
int a,b,c,d; 
a=10; 
b=a++; 
c=++a; 
d=10*a++; 
printf("b,c,d:%d,%d,%d",b,c,d); 
return 0; 
}  



答:1012120

27. 設有以下說明和定義 :

typedef union
{
long i;
int k[5];
char c;
} DATE;

struct data
{
int cat;
DATE cow;
double dog;
} too;

DATE max;


則語句 printf("%d",sizeof(struct data)+sizeof(max));的執行結果是:_______ 答:DATE是一個union, 變數公用空間裡面最大的變數型別是int[5], 佔用20個位元組所 以它的大小是20 data是一個struct, 每個變數分開佔用空間依次為int4 + DATE20 + double8 = 32. 所以結果是 20 + 32 = 52. 當然...在某些16位編輯器下, int可能是2位元組,那麼結果是 int2 + DATE10 + double8 = 20 

28.請找出下面程式碼中的所有錯誤 

說明:以下程式碼是把一個字串倒序,如abcd倒序後變為dcba
#include"string.h"
main() 
{  
char*src="hello,world"; 
char* dest=NULL;  
int len=strlen(src); 
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0)
d++=s--; 
printf("%s\n",dest);  
return 0; 
} 

答: 

方法1: 

int main()
{ 
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);
char* d = dest;
char* s = &src[len-1];
while( len-- != 0 )
*d++=*s--;
*d = 0;
printf("%s\n",dest);
free(dest);
return 0;
}

 

方法2: 

#include <stdio.h>
#include <string.h> 
int main() 
{ 
char str[]="hello,world";
int len=strlen(str);
char t; 
for(int i=0; i<len/2; i++) 
{ 
t=str[i];
str[i]=str[len-i-1];
str[len-i-1]=t;
} 
printf("%s",str);
return 0; 
}


29.閱讀以下程式並填空

unsigned char *p1; 
    unsigned long *p2; 
    p1=(unsigned char *)0x801000; 
    p2=(unsigned long *)0x810000; 
    請問p1+5=__; 
        p2+5=__; 

0x8010050x810014

30. 下述三個有什麼區別?

char * const p; 
char const * p 
const char *p
 
char * const p; //常量指標,p的值不可以修改 
char const * p;//指向常量的指標,指向的常量值不可以改 
const char *p; //和char const *p


31. 什麼是預編譯 

何時需要預編譯: 1、總是使用不經常改動的大型程式碼體。  2、程式由多個模組組成,所有模組都使用一組標準的包含檔案和相同的編譯選項。在這 種情況下,可以將所有包含檔案預編譯為一個預編譯頭。

32. C/C++編譯器中虛表是如何完成的?


二、程式設計題

使用者輸入M,N值,從1N開始順序迴圈數數,每數到M輸出該數值,直至全部輸出。寫出 C程式。 迴圈連結串列,用取餘操作做

// 使用者輸入M,N值,從1至N開始順序
// 迴圈數數,每數到M輸出該數值,
// 直至全部輸出
#include <stdio.h>

// 節點
typedef struct node
{
    int data;
    node* next;
}node;

// 建立迴圈連結串列,一共有 N 個數
void createList(node*& head, node*& tail, int n)
{
    if(n<1)
    {
        head = NULL;
        return ;
    }
    head = new node();
    head->data = 1;
    head->next = NULL;
    
    node* p = head;
    for(int i=2; i<n+1; i++)
    {
        p->next = new node();
        p = p->next;
        p->data = i;
        p->next = NULL;
    }
    
    tail = p;
    p->next = head;
}

// 列印迴圈連結串列
void Print(node*& head)
{
    node* p = head;
    
    while(p && p->next!=head)
    {
        printf("%d ", p->data);
        p=p->next;
    }
    if(p)
    {
        printf("%d\n", p->data);
    }
}

// 使用者輸入M,N值,從1至N開始順序
// 迴圈數數,每數到M輸出該數值,
// 直至全部輸出
void CountPrint(node*& head, node*& tail, int m)
{
    node* cur = head;
    node* pre = tail;
    
    int cnt = m-1;
    while(cur && cur!=cur->next)
    {
        if(cnt)
        {   // 數 m 個數
            cnt--;
            pre = cur;
            cur = cur->next;
        }
        else
        {   // 數完 m 個數,則輸出(刪除)該數
            pre->next = cur->next;
            printf("%d ", cur->data);
            delete cur;
            cur = pre->next;
            cnt = m-1;
        }    
    }
    
    if(cur)
    {
        printf("%d ", cur->data);
        delete cur;
        head = tail = NULL;
    }
    printf("\n");
}

int main()
{
    node* head;
    node* tail;
    int m;
    int n;
    scanf("%d", &n);
    scanf("%d", &m);
    createList(head, tail, n);
    Print(head);
    CountPrint(head, tail, m);
    return 0;
}



相關推薦

經典基礎C++試題2答案

1. C中static有什麼作用?(1)隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。(2)static的第二個作用是保持變數內容的持久。儲存在靜態資

Java基礎、Java集合、多執行緒、JDBC、HTTP、JSP、Servlet、Struts面試題彙總答案

[Java基礎] 1.”==”和equals方法有什麼區別? 答:==是運算子,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字串內容。 2. switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

2018年java面試題總結答案

1.什麼是B/S架構?C/S架構? B/S(Browser/Server),瀏覽器/伺服器程式; C/S(Client/Server),客戶端/服務端,桌面應用程式。 2.網路協議有哪些? HTTP:超文字傳輸協議; SMPT:簡單郵件協議; TELNET:遠端終端

Java面試題總結答案

  1.什麼是B/S架構?C/S架構? B/S(Browser/Server),瀏覽器/伺服器程式; C/S(Client/Server),客戶端/服務端,桌面應用程式。     2.網路協議有哪些? HTTP:超文字傳輸協議;

大型網際網路公司必備的java面試題答案

1、作用域public,private,protected,以及不寫時的區別 答:區別如下: 作用域 當前類 同一package 子孫類 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √

c++面試題整理答案

知乎連結: 校招主要考察基礎和思維,主要涉及C++語言基礎,資料結構與演算法,TCP/IP協議,網路程式設計,Linux。 C和C++語言基礎 參考書籍:《C++ primer》,《effective C++》,《STL原始碼解析》,《深度搜索C++物件模型》

大資料面試題總結答案

目錄 最近由於要準備面試就開始提早看些面試、筆試題。以下是自己總結的一些經常出現、有價值的試題,包含hadoop、hive、hbase、storm、spark等。答案僅供參考,如有錯誤,請指

C語言基礎之常用檔案操作2程式碼

這裡在上一章的基礎上再介紹幾個常用的檔案操作的函式,包括fprintf、fscanf、ftell、fseek等。 檔案操作函式介紹 1、fprintf 函式 函式原型: int fpringf(FILE* stream,const char *forma

Java基礎階段試題2

return throws 行處理 錯誤 try ray 一段 內存操作 ica Java基礎階段筆試題2 問題:Collection 和 Collections的區別?(10分) 本題目的:檢測對面結合類的理解 答案: Collection是集合類的上級接口(

超全數據挖掘面試試題答案

縮放 window 目的 決策樹 密度 邊界 bp神經網絡 主場 至少 一、單選題(共80題) ( D )的目的縮小數據的取值範圍,使其更適合於數據挖掘算法的需要,並且能夠得到和原始數據相同的分析結果。 A.數據清洗 B.數據集成 C.數據變換 D.

乾貨 | 45道CSS基礎試題答案

  1、 介紹一下標準的CSS的盒子模型?與低版本IE的盒子模型有什麼不同的? 標準盒子模型:寬度=內容的寬度(content)+ border + padding + margin 低版本IE盒子模型:寬度=內容寬度(content+border+padding)+ mar

50道CSS基礎試題答案

作者:劉寧Leo https://segmentfault.com/a/1190000013325778https://mp.weixin.qq.com/s/-s9U99TyH_SnMCCIDe1tMA1 介紹一下標準的CSS的盒子模型?與低版本IE的盒子模型有什麼不同的?標

20道HTML基礎試題答案

以下是我整理的一些HTML的基礎面試體,並自己整理了答案。https://segmentfault.com/a/11900000133118801 DOCTYPE有什麼作用?標準模式與混雜模式如何區分?它們有何意義?告訴瀏覽器使用哪個版本的HTML規範來渲染文件。DOCTYP

C/C++及資料結構試題集錦校園招聘之一

嗯,這是我從學校bbs精華區整理的c/c++及資料結構的筆試以及部分面試題集錦,覺得只要搞懂了這些題目,大部分的筆試都不懼了。希望能給需要的人帶來幫助。順便攢rp ^_^ 不過大部分題目沒有答案,歡迎補充哦~~~~ 一: 已知類String的原型為: class Str

鏈家試題22018.4.8

題目:在迷迷糊糊的大草原上,小紅撿到了n根木棍,第i根木棍的長度為i,小紅現在很開心。 她想選出其中的三根木棍組成美麗的三角形。 但是小明想捉弄小紅,想去掉一些木棍,使得小紅任意選三根木棍都不能組成三角形。 請問小明最少去掉多少根木棍呢? 輸入 本題包含若干組測試資料。 對於

2019年19道java經典試題答案

可變對象 caption 反射 進制 不可 tostring 靈活性 clear 散列表 1.不可變對象 指對象一旦被創建狀態不能再改變。任何修改都會創建一個新的對象,如 String、Integer及其它包裝類。 2.能否創建一個包含可變對象的不可變

成為大數據頂尖程序員,先過了這些Hadoop面試題答案解析

大禮包 雲計 default blank mas 阻止 launcher inpu 建立 導讀:在大數據開發崗位的需求下,工資待遇水漲船高,不少編程人員在面對職業瓶頸期的時候,會選擇轉編程方向發展。你是否已經意識這是你人生中的一個重要轉機?能不能抓住這個時代的機遇,就在於你

java面試試題彙總陸續補充

最近自己也在準備面試的一方面東西,遇到一些不太熟悉的地方我會陸續補充上來。 1.選擇排序和氣泡排序 /** * 選擇排序 * @param arr * @return */ public static int[] ChooseSor

30道python真實面試題答案

  最近收集整理了100道python真實面試筆試題,並自己做了一些,希望能幫助大家,順利早日找到工作,限於篇幅問題,本文附有30道面試題計算答案。                學習Python中有

資料庫常見面試題答案

1.事務四大特性  原子性,要麼執行,要麼不執行  隔離性,所有操作全部執行完以前,其它會話不能看到過程  一致性,事務前後,資料總額一致  永續性,一旦事務提交,對資料的改變就是永久的 2.資料庫隔離級別,每個級別會引發什麼問題,mysql預設是哪個級別 髒讀:事務B讀