最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

2020年最全面的C++復(fù)習(xí)大綱!面向?qū)ο蟪绦蛟O(shè)計,只需這一份

2020-11-02 18:56 作者:C語言編程__Plus  | 我要投稿



1.敘述面向?qū)ο缶幊痰奶攸c是什么?(提示:封裝、繼承、多態(tài)。)

對比面向過程具有抽象、封裝、繼承和多態(tài)的特點。

封裝是將抽象得到的數(shù)據(jù)和行為相結(jié)合,形成了一個有機(jī)整體,使得一部分成員充當(dāng)類與外部的接口,而將其他成員隱藏了起來達(dá)到了對成員訪問權(quán)限的合理控制,使得不同類之間的影響最小,加強(qiáng)數(shù)據(jù)安全,簡化編程。

繼承允許在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體、更詳細(xì)的說明,能夠很好反映出特殊概念和一般概念之間的關(guān)系,是代碼復(fù)用的基礎(chǔ)機(jī)制。

多態(tài)使得一段程序能夠具有處理多種類型對象的能力,相同的消息在不同的對象下會有不同的動作,增強(qiáng)了編程的靈活性。


2.使用const定義常量與用使用define定義常量相比,有什么優(yōu)點?

a. const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對const常量進(jìn)行類型安全檢查,而對宏常量只能字符替換

b. 有些集成化的調(diào)試工具能對const常量進(jìn)行調(diào)試,對宏常量不能調(diào)試

c.const定義的常量在程序運行的過程中只有一份拷貝,而define定義的常量在內(nèi)存中有若干拷貝。


3.用代碼說明在標(biāo)準(zhǔn)C++中如何進(jìn)行輸入輸出,并解釋各語句的含義是什么?

cout<<"hello!"<<"world";

cin>>a>>b;

在輸入時,從鍵盤輸入的數(shù)據(jù)先放在鍵盤緩沖區(qū)中,當(dāng)按回車鍵時,鍵盤緩沖區(qū)中的數(shù)據(jù)輸入到程序中的輸入緩沖區(qū),形成cin流,然后用流提取運算符“>>”從輸入緩沖區(qū)中提取數(shù)據(jù)送給程序中的有關(guān)變量。

當(dāng)用cout和流插入運算符“<<”向顯示器輸出數(shù)據(jù)時,先將這些數(shù)據(jù)送到程序中的輸出緩沖區(qū)保存,直到緩沖區(qū)滿了或遇到endl,就將緩沖區(qū)中的全部數(shù)據(jù)送到顯示器顯示出來。


4.C++中如何進(jìn)行靜態(tài)類型轉(zhuǎn)換,解釋并舉例說明。

(1)用于類層次結(jié)構(gòu)中基類和派生類之間指針或引用的轉(zhuǎn)換。進(jìn)行上行轉(zhuǎn)換(把派生類的指針或引用轉(zhuǎn)換成基類表示)是安全的;進(jìn)行下行轉(zhuǎn)換(把基類指針或引用轉(zhuǎn)換成派生類表示)時,由于沒有動態(tài)類型檢查,所以是不安全的。


將派生類型的指針轉(zhuǎn)化為基類型的指針

(2)用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,把int轉(zhuǎn)換成enum。這種轉(zhuǎn)換的安全性也要開發(fā)人員來保證。

double a; int b=100;

a =static_cast (b);

(3)把空指針轉(zhuǎn)換成目標(biāo)類型的空指針(不安全??!)。

(4)把任何類型的表達(dá)式轉(zhuǎn)換成void類型。


5.闡述C++中函數(shù)三種調(diào)用的方式實現(xiàn)機(jī)制、特點及其實參、形參的格式,最好用代碼說明。(提示:傳址、傳值、引用傳遞)

在C++中調(diào)用函數(shù)時有三種參數(shù)傳遞方式:

(1)傳值調(diào)用;


(2)傳址調(diào)用(傳指針);

用指針類型作為形參的值調(diào)用方式,可以通過參數(shù)返回修改后的值。


(3)引用傳遞;

按引用傳遞,引用實參的引用參數(shù)傳遞給函數(shù),而不是進(jìn)行參數(shù)拷貝。引用類型的形參與相應(yīng)的實參占用相同的內(nèi)存空間,改變引用類型形參的值,相應(yīng)實參的值也會隨著變化。


6.什么是內(nèi)聯(lián)函數(shù)?為什么要使用內(nèi)聯(lián)函數(shù)?

在編譯時將所調(diào)用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去,這種嵌入到主調(diào)函數(shù)中的函數(shù)成為內(nèi)聯(lián)函數(shù)。

為了節(jié)省參數(shù)傳遞、控制轉(zhuǎn)換等開銷,比如:壓棧、彈棧、保存現(xiàn)場與恢復(fù)現(xiàn)場。


7.什么是類的前向聲明?使用類的前向聲明時,要注意什么?

遇到倆個類相互引用的循環(huán)依賴情況


前向引用聲明,是在引用未定義的類之前,聲明該類,使編譯器知道那是一個類名。這樣,當(dāng)程序中使用這個類名時,編譯器就不會認(rèn)為是錯誤,而類的完整定義可以在程序的其他地方。

注意:盡管使用了前向引用聲明,但是在提供一個完整的類聲明之前,不能定義該類的對象,也不能在成員函數(shù)中使用該類的對象。只能用于定義指針、引用、以及用于函數(shù)形參的指針和引用。當(dāng)你使用前向引用聲明時,你只能使用被聲明的符號,而不能涉及類的任何細(xì)節(jié)。


8.什么是先驗條件(Precondition),什么是后置條件(Postcondition)?(google)

先演條件是在執(zhí)行某段代碼或正式規(guī)范操作之前必須始終為真的條件或謂詞。比如輸入一個時間必須小于24。

后置條件是在執(zhí)行某段代碼或正式規(guī)范操作之后必須始終為真的條件或謂詞。比如計算輸入數(shù)字的平方根程序可能具有結(jié)果為數(shù)字的后置條件,且其平方等于輸入。


9.什么是名稱空間(namespace)?它的主要作用是什么?要使用一個名稱空間中聲明的標(biāo)識符,方式有哪些?

A namespace is a scope.

C++ provides namespaces to prevent name conflicts

名字空間實質(zhì)上是一種作用域。名字空間是一種描述邏輯分組的機(jī)制,是為了解決C++中的變量、函數(shù)命名沖突而服務(wù)的。

C++標(biāo)準(zhǔn)程序庫中的所有標(biāo)識符都被定義于一個名為std的namespace中。

由于namespace的概念,使用C++標(biāo)準(zhǔn)程序庫的任何標(biāo)識符時,可以有三種選擇:

a、直接指定標(biāo)識符。

例如std::ostream而不是ostream。完整語句如下:

#include std::cout <<"hello!!"<< std::endl;

b、使用using關(guān)鍵字進(jìn)行聲明

顯然,當(dāng)某個名字在它自己的名字空間之外頻繁使用時,在反復(fù)寫它時都要加上名字空間來作限定詞,是一件令人厭煩的事情。這時,可以通過一個使用聲明而清楚掉,只需要在某個地方說明,在這個作用域其后的代碼中,使用此名字時可以自動解析出此名字所在的空間。例如:


此后在使用cout和endl時,都無需再加上名字空間前緣了:

cout <<"hello!!"<< endl;

c、最方便的就是使用指令using namespace std;

一個使用指令能把來自另一個名字空間的所有名字都變成在當(dāng)前名字空間內(nèi)可用,就像這些名字就在當(dāng)前名字空間中一樣。

例如,在一個名字空間內(nèi)有命令 using namespace std; 則在此后的代碼中(當(dāng)前空間最小局部內(nèi)),對于所有名字都無需有名字空間前綴即可使用。


10.什么是重載(Overloading),解釋并舉例說明?能否根據(jù)返回值不同,對函數(shù)進(jìn)行重載,為什么?

C++有兩種重載:函數(shù)重載和運算符重載。

C++允許用同一函數(shù)名定義多個函數(shù),這些函數(shù)的參數(shù)個數(shù)和參數(shù)類型不同。這就是函數(shù)的重載(function overloading)。

運算符重載實質(zhì)上是函數(shù)的重載,運算符重載通過運算符函數(shù)實現(xiàn)。

int max(inta,intb,intc);double max(doublea,doubleb,doublec);long max(longa,longb,longc);

不能根據(jù)返回值不同進(jìn)行重載。

因為調(diào)用時不能指定類型信息,編譯器不知道你要調(diào)用哪個函數(shù)。

例如:float max(int a,int b);int max(int a,int b);

當(dāng)調(diào)用max(1, 2);時無法確定調(diào)用的是哪個,單從這一點上來說,僅返回值類型不同的重載是不應(yīng)該允許的。


11.關(guān)鍵字const的用法有哪些?(google)

一、定義常量

常量不可修改

const int val = 5; int const val = 5;

與#define宏定義常量的區(qū)別:

(1)const常量具有類型,編譯器可以進(jìn)行安全檢查;#define宏定義沒有數(shù)據(jù)類型,只是簡單的字符串替換,不能進(jìn)行安全檢查。

(2)有些集成化的調(diào)試工具能對const常量進(jìn)行調(diào)試,對宏常量不能調(diào)試

二、修飾指針

(1)const int* p; ????????//指針p指向的內(nèi)容是常量,不可改變。

(2)int* const p; ?????????//指針本身是一個常量,不可改變。

(3)const int* const p; ??//指針本身和指向的內(nèi)容都是常量,都不可以改變。

區(qū)分方法,*p代表對象內(nèi)容,p代表指針本身,看const修飾的是哪個。

三、在函數(shù)中使用const

修飾函數(shù)參數(shù)

void function(const int Var);

表明參數(shù)在函數(shù)體內(nèi)不能被修改,但此處沒有任何意義,Var本身就是形參,在函數(shù)內(nèi)不會改變。

包括傳入的形參是指針也是一樣。

(1)使用引用參數(shù),可以防止創(chuàng)建副本,減少內(nèi)存開銷,同時可以在函數(shù)中對引用參數(shù)修改,函數(shù)結(jié)束后,引用參數(shù)的修改仍然存在。

(2)如果為了防止對引用參數(shù)進(jìn)行修改,可以對該參數(shù)加上const關(guān)鍵字。

修飾函數(shù)返回值

與修飾普通變量和指針意義差不多,而在傳引用時,如果不希望函數(shù)返回值被改變,就可以添加關(guān)鍵字 const 。

四、在類中使用const

修飾類成員變量

class A

{ const int nValue;

}

(1)成員常量不可被修改。

(2)只能在初始化列表中被賦值。

修飾類成員函數(shù)

class A

{ void function()const;

}

(1)常成員函數(shù), 它不改變對象的成員變量. 代表只讀函數(shù),增加程序的可讀性。

(2)不能調(diào)用類中任何非const成員函數(shù)。


12.操作符new的作用是什么?如何申請單個空間?如何申請動態(tài)數(shù)組?用new創(chuàng)建一個類的對象時,會發(fā)生哪些操作?必要時,請用代碼說明。

作用:在堆中申請一段空間,動態(tài)分配內(nèi)存

申請單個空間int *i = new int;

申請動態(tài)數(shù)組int *a = new int[10];

new創(chuàng)建類對象需要指針接收,一處初始化,多處使用,作用域是全局,且需要手動釋放空間,在堆中動態(tài)分配內(nèi)存,調(diào)用構(gòu)造函數(shù)。


13.操作符delete的作用是什么?如何刪除單個用new申請的空間?如何刪除申請的動態(tài)數(shù)組?用delete刪除一個類的對象時,會發(fā)生哪些操作?必要時,請用代碼說明。

作用:釋放所申請的空間

釋放單個空間delete i;

釋放動態(tài)數(shù)組delete []a;

釋放在堆中分配的內(nèi)存,調(diào)用析構(gòu)函數(shù)。


14.什么是懸掛指針(又稱為野指針,Dangling Pointers),其危害是什么?(google)

指針指向非法的內(nèi)存地址,那么這個指針就是懸掛指針,也叫野指針。意為無法正常使用的指針。野指針造成的危害程度和危害時間未知,因為野指針指向的內(nèi)存空間,有可能是某個重要的數(shù)據(jù)或其他程序。嚴(yán)重的情況下會造成程序崩潰。


15.什么是類?通常一個類中,包含什么樣的內(nèi)容?定義一個類的語法是什么,試舉例說明。

類是邏輯上相關(guān)的函數(shù)與數(shù)據(jù)的封裝,描述了所創(chuàng)建對象共同的屬性和方法。類中聲明或定義的變量和函數(shù)稱為成員,類的成員包括數(shù)據(jù)成員和函數(shù)成員,數(shù)據(jù)成員描述問題的屬性,函數(shù)成員描述問題的行為。


16.什么是對象?什么是類?類與對象的關(guān)系是什么?

類是邏輯上相關(guān)的函數(shù)與數(shù)據(jù)的封裝,它是對問題的抽象描述。

對象是類的某一特定實體。

將整個公司的雇員看成一個類,那么每一個雇員就是該類的一個特定實體,也就是一個對象。

類對象的關(guān)系:類是對象的抽象,而對象是類的具體實例。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。類是用于創(chuàng)建對象的藍(lán)圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模板。


17.類中的成員可以用public/protected/private分別進(jìn)行修飾,這三種成員在什么情況下是可以被訪問的?類中沒有用public/protected/private修飾的成員,其可訪問性是什么,結(jié)構(gòu)體中沒有用public/protected/private修飾的成員,其可訪問性是什么?

public修飾的成員可以在任何地方被訪問

private修飾的成員只能由該類中的函數(shù)、其友元函數(shù)訪問;不能被任何其他訪問,該類對象也不能訪問。

protected修飾的成員可以被該類中函數(shù)、子類函數(shù)、友元函數(shù)訪問;但不能被該類對象訪問。

public可以被訪問,沒有修飾,類的默認(rèn)為private,struct默認(rèn)為public。


18.什么是封裝?其作用是什么?(google)

封裝就是將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個有機(jī)的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的函數(shù)代碼進(jìn)行有機(jī)結(jié)合,形成類。

作用:

使一部分成員充當(dāng)類與外部的接口,而將其他成員隱藏起來,這樣就達(dá)到了對成員訪問權(quán)限的合理控制,使不同類之間的相互影響減少到最低限度,進(jìn)而保護(hù)數(shù)據(jù)增強(qiáng)數(shù)據(jù)的安全性和簡化程序編寫工作。


19.什么是構(gòu)造函數(shù)?構(gòu)造函數(shù)有返回值嗎?構(gòu)造函數(shù)如何命名?構(gòu)造函數(shù)可以重載嗎?什么是缺省構(gòu)造函數(shù)(default constructor)?什么情況下,類中會有缺省構(gòu)造函數(shù)?

構(gòu)造函數(shù)主要用來在創(chuàng)建對象時初始化對象, 即為對象成員變量賦初始值。

構(gòu)造函數(shù)沒有返回值。

構(gòu)造函數(shù)是一個與其所在的類同名的函數(shù)。

構(gòu)造函數(shù)可以重載。但是, 每個構(gòu)造函數(shù)必須有不同的函數(shù)簽名。

如果構(gòu)造函數(shù)沒有參數(shù),或者構(gòu)造函數(shù)的所有參數(shù)都有默認(rèn)值,就可以稱其為缺省構(gòu)造函數(shù)。一個類中,只能有一個缺省構(gòu)造函數(shù)。

當(dāng)沒有定義構(gòu)造函數(shù)或者定義的構(gòu)造函數(shù)沒有參數(shù)時,類中會有缺省構(gòu)造函數(shù)。



20.若父類中沒有缺省構(gòu)造函數(shù),則對派生類的構(gòu)造函數(shù)有什么要求?

如果父類是一個無缺省參數(shù)的構(gòu)造函數(shù),那么對于派生類一旦沒有構(gòu)造函數(shù),那么就不會自動的先構(gòu)造父類的構(gòu)造函數(shù),這是不允許的。

派生類中一定要有構(gòu)造函數(shù)。

BaseballTeam(const string s[], int si) : Team(si)

派生類的構(gòu)造函數(shù)通過初始化列表,對基類進(jìn)行初始化。


21.構(gòu)造函數(shù)的作用是什么?什么時候會被調(diào)用?構(gòu)造函數(shù)的執(zhí)行順序是什么(父類與子類的構(gòu)造函數(shù)、類自身與其數(shù)據(jù)成員的構(gòu)造函數(shù))?

構(gòu)造函數(shù)主要用來在創(chuàng)建對象時初始化對象, 即為對象成員變量賦初始值。

當(dāng)類被創(chuàng)建時,自動調(diào)用。

執(zhí)行構(gòu)造函數(shù)的順序:

父類的構(gòu)造函數(shù)

數(shù)據(jù)成員的初始化(成員中有類,執(zhí)行該類的構(gòu)造函數(shù))

子類的構(gòu)造函數(shù)


22.什么是類作用域(Class scope)、文件作用域(file scope)、函數(shù)作用域(function scope)?

類作用域:

類是有名成員的集合,類X的成員m具有類作用域,對成員m的訪問方式有如下三種:

1)如果X的成員函數(shù)中沒有聲明同名的局部作用域標(biāo)識符,那么可以直接使用成員m

2)通過表達(dá)式x.m或X::m(訪問靜態(tài)成員)

3)通過ptr->m,其中ptr為指向X類的一個對象的指針

文件作用域:

在函數(shù)外部聲明的變量只在當(dāng)前文件范圍內(nèi)(包括文件內(nèi)所有定義的函數(shù))可用

在其他文件不可用。要使變量具有文件作用域,必須在變量的聲明前加static關(guān)鍵字。

當(dāng)多個源文件鏈接成一個程序時,static可以避免一個文件中的全局變量與其它文件中的變量同名而發(fā)生沖突。

函數(shù)作用域:

(1)指在函數(shù)定義或者復(fù)合語句中,從標(biāo)識符的定義點開始到函數(shù)或者一對花括號之間的程序段。

(2)在同一個局部作用域內(nèi)不能出現(xiàn)相同名字的兩個局部變量(包括形參)。

(3)一個函數(shù)內(nèi)的復(fù)合語句又是一個局部作用域,也就是在函數(shù)內(nèi)有某個變量時,復(fù)合語句中可以有另外一個同名字的變量。


23.為什么拷貝構(gòu)造函數(shù)(copy constructor)的參數(shù)必須是按引用傳遞(by reference)而不能是按值傳遞(by value)?

1.無限遞歸調(diào)用:

當(dāng)一個對象需要以值方式傳遞時編譯器會生成代碼調(diào)用它的拷貝構(gòu)造函數(shù)以生成一個復(fù)本。如果類A的拷貝構(gòu)造函數(shù)是以值方式傳遞一個類A對象作為參數(shù)的話,當(dāng)需要調(diào)用類A的拷貝構(gòu)造函數(shù)時,需要以值方式傳進(jìn)一個A的對象作為實參;而以值方式傳遞需要調(diào)用類A的拷貝構(gòu)造函數(shù);結(jié)果就是調(diào)用類A的拷貝構(gòu)造函數(shù)導(dǎo)致又一次調(diào)用類A的拷貝構(gòu)造函數(shù),這就是一個無限遞歸。

2在某些狀況下,類內(nèi)成員變量需要動態(tài)開辟堆內(nèi)存,如果實行位拷貝,也就是把對象里的值完全復(fù)制給另一個對象,如A=B。這時,如果B中有一個成員變量指針已經(jīng)申請了內(nèi)存,那A中的那個成員變量也指向同一塊內(nèi)存。這就出現(xiàn)了問題:當(dāng)B把內(nèi)存釋放了(如:析構(gòu)),這時A內(nèi)的指針就是野指針了,出現(xiàn)運行錯誤。


24.拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))的作用是什么?什么是淺拷貝?什么是深拷貝?(google)

復(fù)制構(gòu)造函數(shù)由編譯器調(diào)用來完成一些基于同一類的其他對象的構(gòu)件及初始化。

淺拷貝只是對指針的拷貝,拷貝后兩個指針指向同一個內(nèi)存空間,深拷貝不但對指針進(jìn)行拷貝,而且對指針指向的內(nèi)容進(jìn)行拷貝,經(jīng)深拷貝后的指針是指向兩個不同地址的指針。


25.全局對象(Global scope objects)的構(gòu)造函數(shù)、析構(gòu)函數(shù)分別是什么時候被調(diào)用的?

自動局部對象(Automatic local objects)的構(gòu)造函數(shù)、析構(gòu)函數(shù)分別是什么時候被調(diào)用的?

靜態(tài)局部對象(static local objects)的構(gòu)造函數(shù)、析構(gòu)函數(shù)分別是什么時候被調(diào)用的?

a.全局變量構(gòu)造函數(shù)程序運行前被調(diào)用,在main()函數(shù)返回后才被中對象才被銷毀,析構(gòu)函數(shù)在程序結(jié)束前最后被調(diào)用。

b.自動局部變量,當(dāng)程序執(zhí)行到對象定義時,調(diào)用自動局部對象的構(gòu)造函數(shù)。該對象的析構(gòu)函數(shù)在對象離開范圍時調(diào)用(即離開定義對象的塊時)。自動對象的構(gòu)造函數(shù)與析構(gòu)函數(shù)在每次對象進(jìn)人和離開范圍時調(diào)用。

c.靜態(tài)局部對象的構(gòu)造函數(shù)只在程序執(zhí)行首次到達(dá)對象定義時調(diào)用一次,對應(yīng)的析構(gòu)函數(shù)在main終止或調(diào)用exit函數(shù)時調(diào)用。


26.什么是初始化列表(Initialization Sections)?它的作用是什么?(提示:一般數(shù)據(jù)成員的初始化、常成員的初始化,對象成員構(gòu)選函數(shù)的選擇、父類構(gòu)造函數(shù)的選等)。

構(gòu)造函數(shù)初始化列表以一個冒號開始,接著是以逗號分隔的數(shù)據(jù)成員列表,每個數(shù)據(jù)成員后面跟一個放在括號中的初始化式。


初始化列表作用:一般數(shù)據(jù)成員的初始化、常成員的初始化,對象成員構(gòu)選函數(shù)的選擇、父類構(gòu)造函數(shù)的選擇。


27.什么是純虛函數(shù)?什么是抽象數(shù)據(jù)類型(ADT)?抽象類的作用是什么?抽象類是否可實例化?抽象類的什么樣子類可以實例化?(google)

純虛函數(shù)是沒有函數(shù)體的虛函數(shù),它的實現(xiàn)留給該基類的派生類去做,這就是純虛函數(shù)的作用。

抽象類是一種特殊的類,它是為了抽象和設(shè)計的目的而建立的,它處于繼承層次結(jié)構(gòu)的較上層。

抽象類不可實例化,只可以派生。

抽象類派生的子類必須重置基類的純虛函數(shù)才能實現(xiàn)實例化。

抽象數(shù)據(jù)類型是具有類似行為的特定類型的數(shù)據(jù)結(jié)構(gòu)的數(shù)學(xué)模型:或者具有類似語義的一種或者多種程序設(shè)計語言的數(shù)據(jù)類型。

抽象數(shù)據(jù)類型的描述包括給出抽象數(shù)據(jù)類型的名稱、數(shù)據(jù)的集合、數(shù)據(jù)之間的關(guān)系和操作的集合等方面的描述。抽象數(shù)據(jù)類型的設(shè)計者根據(jù)這些描述給出操作的具體實現(xiàn),抽象數(shù)據(jù)類型的使用者依據(jù)這些描述使用抽象數(shù)據(jù)類型。

抽象數(shù)據(jù)類型描述的一般形式如下:

ADT 抽象數(shù)據(jù)類型名稱

{

數(shù)據(jù)對象:

……

數(shù)據(jù)關(guān)系:

……

操作集合:

操作名1:

……

……

操作名n:

}ADT抽象數(shù)據(jù)類型名稱

抽象數(shù)據(jù)類型定義(ADT)

作用:抽象數(shù)據(jù)類型可以使我們更容易描述現(xiàn)實世界。例:用線性表描述學(xué)生成績表,用樹或圖描述遺傳關(guān)系。

定義:一個數(shù)學(xué)模型以及定義在該模型上的一組操作。

關(guān)鍵:使用它的人可以只關(guān)心它的邏輯特征,不需要了解它的存儲方式。定義它的人同樣不必要關(guān)心它如何存儲。

例:線性表這樣的抽象數(shù)據(jù)類型,其數(shù)學(xué)模型是:數(shù)據(jù)元素的集合,該集合內(nèi)的元素有這樣的關(guān)系:除第一個和最后一個外,每個元素有唯一的前趨和唯一的后繼??梢杂羞@樣一些操作:插入一個元素、刪除一個元素等。


28.什么是this指針,其作用是什么?

this指針是一個隱含于每一個成員函數(shù)中的特殊指針。它是一個指向正在被該成員函數(shù)操作的對象,也就是要操作該成員函數(shù)的對象。通過this指針可以訪問當(dāng)前對象的所有成員。

this作用域是在類內(nèi)部,當(dāng)對一個對象調(diào)用成員函數(shù)時,編譯程序先將對象的地址賦給this指針,編譯器會自動將對象本身的地址作為一個隱含參數(shù)傳遞給函數(shù)。

在以下場景中,經(jīng)常需要顯式引用this指針:

(1)在類的非靜態(tài)成員函數(shù)中返回類對象本身的時候,直接使用 return *this,例如:實現(xiàn)對象的鏈?zhǔn)揭谩?/p>

(2)當(dāng)參數(shù)與成員變量名相同時,如this->x = x,不能寫成x = x。

(3)避免對同一對象進(jìn)行賦值操作。

if(&pointer!=this) //同一對象之間的賦值沒有意義,所以要保證pointer不等于this

{

X=pointer.X;Y=pointer.Y;

}



29.什么是友元(friend)函數(shù)?為什么要使用友員函數(shù)?

友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾說明的非成員函數(shù)或其它類的成員函數(shù),在它的函數(shù)體中能夠通過對象名訪問 private 和 protected成員

友元函數(shù)可以訪問這個類中的私有成員,增加靈活性,使程序員可以在封裝和快速性方面做合理選擇。

友元是C++提供的一種對數(shù)據(jù)封裝和數(shù)據(jù)隱藏的破壞機(jī)制。


30.如何防止一個頭文件被多重包含?舉例說明。

include "a.h"

include "b.h"

如果a.h和b.h都包含了一個頭文件x.h。那么x.h在此也同樣被包含了兩次,只不過它的形式不是那么明顯而已。

可以使用條件編譯。

ifndef _HEADERNAME_H #define _HEADERNAME_H ..//(頭文件內(nèi)容)

endif

當(dāng)頭文件第一次被包含時,它被正常處理,符號_HEADERNAME_H被定義為1。如果頭文件被再次包含,通過條件編譯,它的內(nèi)容被忽略。

符號_HEADERNAME_H按照被包含頭文件的文件名進(jìn)行取名,以避免由于其他頭文件使用相同的符號而引起的沖突。但是,你必須記住預(yù)處理器仍將整個頭文件讀入,即使這個頭文件所有內(nèi)容將被忽略。由于這種處理將托慢編譯速度,所以如果可能,應(yīng)該避免出現(xiàn)多重包含。


31.什么是運算符重載?為什么要使用運算符重載?如何進(jìn)行運算符重載,舉例說明。

運算符重載,就是對已有的運算符重新進(jìn)行定義,賦予其另一種功能,以適應(yīng)不同的數(shù)據(jù)類型。

擴(kuò)展C++中提供的運算符的適用范圍,以用于類所表示的抽象數(shù)據(jù)類型。同一個運算符,對不同類型的操作數(shù),所發(fā)生的行為不同。

運算符重載的函數(shù)一般地采用如下兩種形式:成員函數(shù)形式和友元函數(shù)形式。這兩種形式都可訪問類中的私有成員。


32.為什么重載為全局函數(shù)的運算符通常要比重載為成員函數(shù)的運算符多一個參數(shù)?舉例說明。

當(dāng)重載為成員函數(shù)時,會有一個this指針,指向當(dāng)前的類,所以只需要一個參數(shù)就可以了。

而當(dāng)重載為全局函數(shù)時,將沒有隱含的參數(shù)this指針,這樣將會多一個參數(shù)。


33.什么是析構(gòu)函數(shù)?析構(gòu)函數(shù)有返回值嗎?析構(gòu)函數(shù)如何命名?析構(gòu)函數(shù)可以重載嗎?

與構(gòu)造函數(shù)相反,當(dāng)對象結(jié)束其生命周期,如對象所在的函數(shù)已調(diào)用完畢時,系統(tǒng)會自動執(zhí)行析構(gòu)函數(shù)。

析構(gòu)函數(shù)沒有返回值。

名字與類名相同,在前面加‘~’。

析構(gòu)函數(shù)不返回任何值,沒有函數(shù)類型,也沒有函數(shù)參數(shù),因此它不能被重載。


34.析構(gòu)函數(shù)的作用是什么?什么時候會被調(diào)用?為什么析構(gòu)函數(shù)通常是虛函數(shù),如果不是虛函數(shù),會如何?(google)

析構(gòu)函數(shù)對象消亡時即自動被調(diào)用。

作用:清空并釋放對象先前創(chuàng)建或者占用的內(nèi)存資源。

如果析構(gòu)函數(shù)不被聲明成虛函數(shù),則編譯器采用的綁定方式是靜態(tài)綁定,在刪除基類指針時,只會調(diào)用基類析構(gòu)函數(shù),而不調(diào)用派生類析構(gòu)函數(shù),這樣就會導(dǎo)致基類指針指向的派生類對象析構(gòu)不完全。

若是將析構(gòu)函數(shù)聲明為虛函數(shù),不管派生類的析構(gòu)函數(shù)前是否加virtual(可以理解為編譯器優(yōu)化),都構(gòu)成重寫?;惖闹羔樦赶蚺缮惖膶ο?,然后調(diào)用重寫虛函數(shù)——析構(gòu)函數(shù),構(gòu)成了多態(tài),而多態(tài)與類型無關(guān),只與對象有關(guān),所以就能夠調(diào)用的就是派生類的析構(gòu)函數(shù)了。


35.在一個類中,為什么靜態(tài)成員函數(shù)(static member function)中不能使用this指針?

靜態(tài)成員函數(shù)并不是針對某個類的實例對象,而是屬于整個類的,為所有的對象實例所共有。他在作用域的范圍內(nèi)是全局的,獨立于類的對象之外的。他只對類內(nèi)部的靜態(tài)成員變量做操作。當(dāng)實例化一個類的對象時候,里面不存在靜態(tài)成員的。this指針是相當(dāng)于一個類的實例的指針,this是用來操作對象實例的內(nèi)容的,既然靜態(tài)成員函數(shù)和變量都是獨立于類的實例對象之外的,他就不能用this指針。也不能操作非靜態(tài)成員。


36.如果要編寫一段程序,跟蹤類A所創(chuàng)建的實例的個數(shù),請敘述編寫程序的大體思路。


37.什么是C++中的三大函數(shù)(The Big Three)?(google)

Big Three: 是指 如果一個類要實現(xiàn)下面某一個成員函數(shù),一般都要一起實現(xiàn)另外兩個:

1)Desconstructor ??????析構(gòu)函數(shù)

2) ?copy constructor ???拷貝構(gòu)造函數(shù)

3) ?operator = ?????????賦值函數(shù)


38.什么是UML?如何畫UML中的類圖?什么是類與類之間依賴關(guān)系、關(guān)聯(lián)關(guān)系、包含關(guān)系?試舉例說明這三種類之間的關(guān)系。這三種關(guān)系如何和UML圖表示?

UML統(tǒng)一建模語言,UML語言是一種可視化的的面向?qū)ο蠼UZ言,描述軟件模型的靜態(tài)結(jié)構(gòu)、動態(tài)行為及模塊組織與管理。

依賴關(guān)系:一個事物的變化可能會影響到使用它的另一個事物。舉例:駕駛員(源)開車(目標(biāo))。

關(guān)聯(lián)關(guān)系:一個類的對象和另一個類的對象之間相互作用。舉例:老師和學(xué)生,小明的語文老師是張老師,張老師的學(xué)生有小明。

包含關(guān)系:聚集和組合

聚集表示類之間的關(guān)系是整體與部分的關(guān)系。舉例:班級成員和學(xué)生。

組合是指整體擁有各個部分,整體和部分共存,整體不存在了,部分也會隨之消失。舉例:打開一個視窗口,它由標(biāo)題、外框和顯示區(qū)域組成,視窗口是一個整體,它消失了,部分也就隨之消失了。

繼承關(guān)系:在UML中稱為泛化。舉例:鴨子和鳥,鴨子是一種鳥,繼承了鳥的特性。


39.常見的類與類之間的關(guān)系有哪幾種,舉例說明每種關(guān)系的對應(yīng)UML圖如何畫?兩個什么樣的類可以實現(xiàn)為繼承關(guān)系?(google)

依賴關(guān)系、關(guān)聯(lián)關(guān)系、包含關(guān)系、繼承關(guān)系。

具有共同屬性的兩個類可以實現(xiàn)繼承關(guān)系。


40.父類成員中的public、protected、private成員,哪些在子類中是可以訪問的?

在公有繼承、私有繼承、受保護(hù)繼承三種繼承方式下,父類成員中的public、protected、private成員被繼承到子類后,其可訪問性分別是什么?

派生類是否可以繼承父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)?

public 和protected是可以訪問的,private不可訪問。

公有繼承:public、protected、private

私有繼承:private、private、private

保護(hù)繼承:protected、protected、private

派生類不能繼承父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。


41.多重繼承會帶來什么問題?在C++中是如何解決的?

問題1:類DC的對象中存在多個同名成員 x, 應(yīng)如何使用?

問題2:類DC的對象中,存在兩份來自類BC0的成員K,如何區(qū)分?

解決方案:

在BC1類和BC2類繼承BC0時,其前面加上virtual關(guān)鍵字就可以實現(xiàn)虛擬繼承,使用虛擬繼承后,當(dāng)系統(tǒng)碰到多重繼承的時候就會先自動加一個BC0的拷貝,當(dāng)再次請求一個BC0的拷貝時就會被忽略,以保證繼承類成員函數(shù)的唯一性。


42.對于函數(shù)調(diào)用,什么是前期綁定(Early Binding,又稱為靜態(tài)聯(lián)編)?什么是的后期綁定(Late Binding,又稱為動態(tài)聯(lián)編)?重載函數(shù)是后期綁定嗎,如果不是為什么?

綁定:程序自身彼此關(guān)聯(lián)的過程,確定程序中的操作調(diào)用與執(zhí)行該操作的代碼間的關(guān)系。例如把一個標(biāo)示符名和一個存儲地址聯(lián)系在一起的過程。

用面向?qū)ο蟮男g(shù)語講,就是把一條消息和一個對象的方法相結(jié)合的過程。

按照綁定進(jìn)行的階段的不同,可以分為靜態(tài)綁定和動態(tài)綁定兩種。

靜態(tài)綁定:綁定工作在編譯連接階段完成。

因為綁定過程是在程序開始執(zhí)行之前進(jìn)行的,因此也稱為早期綁定或前綁定。

在編譯、連接過程中,系統(tǒng)就可以根據(jù)類型匹配等特征確定程序中操作調(diào)用與執(zhí)行該操作代碼的關(guān)系,即確定了某一個同名標(biāo)識到底是要調(diào)用哪一段程序代碼。

動態(tài)綁定:和靜態(tài)綁定相對應(yīng),綁定工作在程序運行階段完成的。


pa->Get( ) 調(diào)用的是 A::Get( )還是B::Get( ),編譯時無法確定,因為不知道MyFunction被調(diào)用時,形參會對應(yīng)于一個 A 對象還是B對象。

所以只能等程序運行到 pa->Get( )了,才能決定到底調(diào)用哪個Get( )。

重載函數(shù)是靜態(tài)綁定。


43.要讓一個函數(shù)調(diào)用表現(xiàn)出多態(tài)特征,必須滿足哪些條件?

a.必須存在繼承關(guān)系;

b.子類重寫父類的方法。繼承關(guān)系中必須有同名的虛函數(shù),并且它們是覆蓋關(guān)系(重載不行)。

c.存在基類的指針,通過該指針調(diào)用虛函數(shù)。


44.簡述虛函數(shù)動態(tài)綁定的實現(xiàn)原理。

構(gòu)造函數(shù)中為對象的虛指針賦值,通過多態(tài)類型的指針或引用調(diào)用成員函數(shù)時,通過虛指針找到虛表,進(jìn)而找到所調(diào)用的虛函數(shù)的入口地址,通過該入口地址調(diào)用虛函數(shù)。


45.什么是隱藏(hiding)、覆蓋(overriding)、重載(overloading)?對比它們的異同?以C++代碼為例進(jìn)行說明。

若基類 B 定義了非虛方法 m,同時其派生類 D 也定義了方法m,此時,我們說派生類方法 D::m 隱藏了繼承自基類的同名方法 B::m 。由于函數(shù)簽名不同,所以二者不構(gòu)成重置。故D::m隱藏了B::m。


覆蓋(override)是指派生類中存在重新定義的函數(shù),其函數(shù)名、參數(shù)列、返回值類型必須同父類中的相對應(yīng)被覆蓋的函數(shù)嚴(yán)格一致,覆蓋函數(shù)和被覆蓋函數(shù)只有函數(shù)體不同,當(dāng)派生類對象調(diào)用派生類中該同名函數(shù)時會自動調(diào)用派生類中的覆蓋版本,而不是父類中的被覆蓋函數(shù)版本,這種機(jī)制就叫做覆蓋。


重載:如果頂層函數(shù)有不同的簽名,則函數(shù)名可以相同。


如果同一類中的函數(shù)有不同的簽名,則函數(shù)名可以相同。


編譯過程中綁定函數(shù)調(diào)用和對應(yīng)的函數(shù)體


46.什么是多態(tài)?

一個組合的希臘詞。含義:一種物質(zhì)有多種形態(tài)。在專業(yè)術(shù)語中,多態(tài)是一種運行時綁定機(jī)制(run-time binding) ,通過這種機(jī)制,實現(xiàn)將函數(shù)名綁定到函數(shù)具體實現(xiàn)代碼的目的。


47.什么是切片(Slicing)?(注意參考講義)

派生類的存儲結(jié)構(gòu)與基類的存儲結(jié)構(gòu)存在著“粘接(splice)”關(guān)系:當(dāng)子類對象拷貝到父類對象時,父類對象中只存在父類定義的成員,而不會出現(xiàn)任何子類中的成員。


48.使用異常處理機(jī)制的好處是什么?

1.將常規(guī)代碼與錯誤處理代碼的分離

2.實現(xiàn)在調(diào)用棧中傳播異常

3.實現(xiàn)對不同的錯誤類型進(jìn)行分類


49.簡述C++中的異常處理機(jī)制。要捕獲某段代碼中的所有異常,應(yīng)該如何編寫代碼?

C++ 用try和catch進(jìn)行異常處理,當(dāng)try塊出現(xiàn)異常,則catch中匹配相應(yīng)的異常處理,若catch塊中沒有匹配該異常對象的語句,則轉(zhuǎn)向外一層的try、catch語句,若一直退回到主函數(shù)都無法處理異常,則由系統(tǒng)調(diào)用terminate()函數(shù)終止程序。用異常規(guī)格(exception specification)列出函數(shù)可能會拋出所有異常的類型。


50.分別舉例說明用于算法抽象的函數(shù)模板和用于數(shù)據(jù)抽象的類模板。(google)

函數(shù)模板:

函數(shù)模板是 對算法相似,但支持的數(shù)據(jù)類型不同的一組操作的提煉,以提高程序的重用性。

函數(shù)模板的實例就是一個用于特定類型的普通函數(shù)。

通常,編譯器可根據(jù)實參類型確定模板參數(shù);


類模板:

使用類模板使用戶可以為類定義一種模式,使得類中的某些數(shù)據(jù)成員、某些數(shù)據(jù)成員函數(shù)的參數(shù)、返回值和局部變量能夠取任意類型(包括系統(tǒng)預(yù)定義和用戶自定義)

有時候,有兩個或多個類,其功能是相同的,僅僅是數(shù)據(jù)類型不同,可以使用模板類。


51.dynamic-cast的作用是什么?試舉例說明。

dynamic_cast< Type-id > ( expression )該運算符把expression轉(zhuǎn)換為type-id類型,并且可以在運行期間檢測類型轉(zhuǎn)換是否安全。dynamic_cast要求轉(zhuǎn)型的目的類型必須是指針或者引用。將基類指針轉(zhuǎn)換為派生類指針,將基類引用轉(zhuǎn)換為派生類引用;轉(zhuǎn)換是有條件的如果指針(或引用)所指對象的實際類型與轉(zhuǎn)換的目的類型兼容,則轉(zhuǎn)換成功進(jìn)行;

本次分享就到這里了,希望對大家有幫助!覺得有用的小伙伴可以收藏哦~

另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!

分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!

學(xué)習(xí)C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~

編程學(xué)習(xí)書籍分享:


編程學(xué)習(xí)視頻分享:



2020年最全面的C++復(fù)習(xí)大綱!面向?qū)ο蟪绦蛟O(shè)計,只需這一份的評論 (共 條)

分享到微博請遵守國家法律
土默特左旗| 柳河县| 历史| 洞口县| 侯马市| 永靖县| 吴忠市| 安福县| 黄陵县| 津市市| 威远县| 明光市| 林州市| 梨树县| 平原县| 宁强县| 华安县| 湖口县| 恩施市| 梨树县| 南澳县| 双城市| 南川市| 明光市| 聂荣县| 马鞍山市| 万安县| 临高县| 莆田市| 响水县| 晋中市| 天等县| 汾西县| 衡水市| 信阳市| 新竹市| 吉首市| 安宁市| 西乌珠穆沁旗| 淮北市| 谢通门县|