C++求职题
文章大部分內(nèi)容轉(zhuǎn)載https://www.cnblogs.com/lanxuezaipiao/p/4127904.html
1.冒泡排序法:
如果有N個(gè)數(shù)字需要排序,那么需要進(jìn)行(N-1)趟循環(huán),第i趟循環(huán)需要對(duì)比的次數(shù)為(N-i)。所以可以用雙重循環(huán),外層循環(huán)用于控制循環(huán)的趟數(shù),內(nèi)層循環(huán)用于控制每一趟循環(huán)的次數(shù)。
冒泡排序的優(yōu)點(diǎn):每進(jìn)行一趟排序,就會(huì)少比較一次,因?yàn)槊窟M(jìn)行一趟排序都會(huì)找出一個(gè)較大值
冒泡排序法時(shí)間復(fù)雜度:
1).如果我們的數(shù)據(jù)正序,只需要走一趟即可完成排序。所需的比較次數(shù)C和記錄移動(dòng)次數(shù)M均達(dá)到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的時(shí)間復(fù)雜度為O(n)。
2).如果很不幸我們的數(shù)據(jù)是反序的,則需要進(jìn)行n-1趟排序。每趟排序要進(jìn)行n-i次比較(1≤i≤n-1),且每次比較都必須移動(dòng)記錄三次來達(dá)到交換記錄位置。在這種情況下,比較和移動(dòng)次數(shù)均達(dá)到最大值:冒泡排序的最壞時(shí)間復(fù)雜度為:O(n2)?。
綜上所述:冒泡排序總的平均時(shí)間復(fù)雜度為:O(n2)?。
雙重for循環(huán)實(shí)現(xiàn)冒泡排序法:
2.有1,2,…,n的無(wú)序數(shù)組,求排序算法,并且要求時(shí)間復(fù)雜度為O(n),空間復(fù)雜度O(1),使用交換,而且一次只能交換兩個(gè)數(shù)。
這個(gè)題的特點(diǎn)是,數(shù)字是連續(xù)的如果是從1到n,那么最終排好序的數(shù)字和下標(biāo)之間只差1,
,
3. 易誤解:如果int a[5], 那么a與&a是等價(jià)的,因?yàn)閮烧叩刂废嗤?/strong>
一定要注意a與&a是不一樣的,雖然兩者地址相同,但意義不一樣,&a是整個(gè)數(shù)組對(duì)象的首地址,而a是數(shù)組首地址,也就是a[0]的地址,a的類型是int[5],a[0]的類型是int,因此&a+1相當(dāng)于a的地址值加上sizeof(int) * 5,也就是a[5],下一個(gè)對(duì)象的地址,已經(jīng)越界了,而a+1相當(dāng)于a的地址加上sizeof(int),即a[1]的地址。
4. 如何將一個(gè)小數(shù)分解成整數(shù)部分和小數(shù)部分?
采用庫(kù)函數(shù)double modf(double x,double *integer)
#include<stdio.h>
#include<math.h>
int main(){
? ? double x,fraction,integer;
? ? while(~scanf("%lf",&x)){
? ? ? ? fraction=modf(x,&integer);
? ? printf("整數(shù)部分=%lf\n",integer);
? ? printf("小數(shù)部分=%lf\n",fraction);
? ? }
? ? return 0;
}
5. 可作為函數(shù)重載判斷依據(jù)的有:參數(shù)個(gè)數(shù)、參數(shù)類型、參數(shù)的排列順序、const修飾符;
? ?不可以作為重載判斷依據(jù)的有:返回類型。
7. C的結(jié)構(gòu)體和C++結(jié)構(gòu)體的區(qū)別
(1)C的結(jié)構(gòu)體內(nèi)不允許有函數(shù)存在,C++允許有內(nèi)部成員函數(shù),且允許該函數(shù)是虛函數(shù)。所以C的結(jié)構(gòu)體是沒有構(gòu)造函數(shù)、析? ?構(gòu)函數(shù)、和this指針的。??
(2)C的結(jié)構(gòu)體對(duì)內(nèi)部成員變量的訪問權(quán)限只能是public,而C++允許public,protected,private三種。
(3)C語(yǔ)言的結(jié)構(gòu)體是不可以繼承的,C++的結(jié)構(gòu)體是可以從其他的結(jié)構(gòu)體或者類繼承過來的。
8. 如何在類中定義常量成員并為其初始化?
解答:只能在初始化列表里對(duì)const成員初始化,像下面這樣:
class CBook { public:const double m_price; 類中的構(gòu)造函數(shù)是為了初始化類中的成員變量的,一般的成員變量可以在構(gòu)造函數(shù)內(nèi)部進(jìn)行初始化,但是對(duì)于常量成員 只可以在構(gòu)造函數(shù)名后面,用初始化列表的形式進(jìn)行初始化。CBook() :m_price(8.8) { } };9. 在定義類的成員函數(shù)時(shí)使用mutable關(guān)鍵字的作用是什么?
解答:當(dāng)需要在const方法中修改對(duì)象的數(shù)據(jù)成員時(shí),可以在數(shù)據(jù)成員前使用mutable關(guān)鍵字,防止出現(xiàn)編譯出錯(cuò)。例子如下:
class CBook { public:mutable double m_price; // 如果不加就會(huì)出錯(cuò)CBook(double price) :m_price(price) { }double getPrice() const; // 定義const方法 }; double CBook::getPrice() const {m_price = 9.8;return m_price; }10.?拷貝構(gòu)造函數(shù)在哪些情況下被調(diào)用?
(1)函數(shù)的參數(shù)為類對(duì)象且參數(shù)采用值傳遞方式;
(2)將類對(duì)象做為函數(shù)的返回值。
11.在C++中,如果確定了某一個(gè)構(gòu)造函數(shù)的創(chuàng)建過程,在該構(gòu)造函數(shù)中如果調(diào)用了其它重載的構(gòu)造函數(shù),它將不會(huì)執(zhí)行其它構(gòu)造函數(shù)的初始化列表部分代碼,而是執(zhí)行函數(shù)體代碼,此時(shí)已經(jīng)退化成普通函數(shù)了。例子說明如下:
class CBook { public:double m_price; 這是一個(gè)構(gòu)造函數(shù)CBook() { ///在這個(gè)無(wú)參的構(gòu)造函數(shù)中調(diào)用了另外一個(gè)重載的構(gòu)造函數(shù),那么這個(gè)構(gòu)造函數(shù)的初始化列表將不會(huì)執(zhí)行。而是直接執(zhí)行函數(shù)體。CBook(8.8);} 這個(gè)是一個(gè)重載的構(gòu)造函數(shù)CBook(double price) : m_price(price) { } }; int main() {CBook c;cout << c.m_price << endl; // 此時(shí)并不會(huì)輸出理想中的8.8 }12. 靜態(tài)數(shù)據(jù)成員只能在全局區(qū)域進(jìn)行初始化,而不能在類體中進(jìn)行(構(gòu)造函數(shù)中初始化也不行),且靜態(tài)數(shù)據(jù)成員不涉及對(duì)象,因此不受類訪問限定符的限制。
class CBook { public:static double m_price; }; double CBook::m_price = 8.8;//只能在這里(全局區(qū))進(jìn)行初始化,不能在構(gòu)造函數(shù)中進(jìn)行初始化。13.?重載++和–時(shí)是怎么區(qū)分前綴++和后綴++的?
例如當(dāng)編譯器看到++a(先自增)時(shí),它就調(diào)用operator++(a);
但當(dāng)編譯器看到a++時(shí),它就調(diào)用operator++(a, int)。即編譯器通過調(diào)用不同的函數(shù)區(qū)別這兩種形式這里的int 是一個(gè)占位符。
14.? C++的多態(tài)性分為靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)。
靜態(tài)多態(tài)性:編譯期間確定具體執(zhí)行哪一項(xiàng)操作,主要是通過函數(shù)重載和運(yùn)算符重載來實(shí)現(xiàn)的;可以通過(參數(shù)數(shù)量,參數(shù)類型,參數(shù)的順序來重載)
動(dòng)態(tài)多態(tài)性:運(yùn)行時(shí)確定具體執(zhí)行哪一項(xiàng)操作,主要是通過虛函數(shù)來實(shí)現(xiàn)的。
多態(tài)發(fā)生的條件:有繼承,有虛函數(shù)的重寫,有父類指針指向子類對(duì)象。
15. 虛函數(shù)原理考察
class A { public:virtual void funa(); ///指針指向虛函數(shù)表virtual void funb();void func(); ///代碼區(qū)static void fund();全局區(qū)static int si; 全局區(qū) private:int i; 棧區(qū)char c; 棧區(qū) };關(guān)于類占用的內(nèi)存空間,有以下幾點(diǎn)需要注意:
(1)如果類中含有虛函數(shù),則編譯器需要為類構(gòu)建虛函數(shù)表,類中需要存儲(chǔ)一個(gè)指針指向這個(gè)虛函數(shù)表的首地址,注意不管有幾個(gè)虛函數(shù),都只建立一張表,所有的虛函數(shù)地址都存在這張表里,類中只需要一個(gè)指針指向虛函數(shù)表首地址即可。
(2)類中的靜態(tài)成員是被類所有實(shí)例所共享的,它不計(jì)入sizeof計(jì)算的空間
(3)類中的普通函數(shù)或靜態(tài)普通函數(shù)都存儲(chǔ)在棧中,不計(jì)入sizeof計(jì)算的空間
(4)類成員采用字節(jié)對(duì)齊的方式分配空間
(5)類中的方法放在代碼區(qū)
(6)static或者字符串常量放在數(shù)據(jù)區(qū)或者是常量區(qū)
(7)類中的普通成員變量放在棧中
(8)通過new分配的變量存儲(chǔ)在堆區(qū)
C語(yǔ)言中的四區(qū)模型,棧區(qū),堆區(qū),代碼區(qū),常量區(qū)或者全局區(qū)
答案:12(32位系統(tǒng))或16(64位系統(tǒng))
16.?虛繼承的作用是什么?
在多繼承中,子類可能同時(shí)擁有多個(gè)父類,如果這些父類還有相同的父類(祖先類),那么在子類中就會(huì)有多份祖先類。例如,類B和類C都繼承與類A,如果類D派生于B和C,那么類D中就會(huì)有兩份A。為了防止在多繼承中子類存在重復(fù)的父類情況,可以在父類繼承時(shí)使用虛函數(shù),即在類B和類C繼承類A時(shí)使用virtual關(guān)鍵字。
17. 32位系統(tǒng)和64位系統(tǒng)各個(gè)數(shù)據(jù)類型所占的內(nèi)存空間
類和結(jié)構(gòu)體中一樣,有四字節(jié)補(bǔ)齊效果,如果計(jì)算的總共的字節(jié)數(shù),除上4之后的余數(shù)不為0,那么最終的所占字節(jié)數(shù)為上面所做除法的商再加上4個(gè)字節(jié)。例如,計(jì)算的總字節(jié)數(shù)為15,那么最終的字節(jié)數(shù)是12+4=16個(gè)字節(jié)。
const關(guān)鍵字:
1)欲阻止一個(gè)變量被改變,可以使用const關(guān)鍵字。在定義該const變量時(shí),通常需要對(duì)它進(jìn)行初始化。因?yàn)橐院缶蜎]有機(jī)會(huì)再改變它了。
2)對(duì)指針來說,可以指定指針的本身為const,也可以指定指針?biāo)赶虻臄?shù)為const。或二者同時(shí)為const。
3)在一個(gè)函數(shù)的聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù)。在函數(shù)內(nèi)不能改變其值。
4)對(duì)于類的成員函數(shù),若指定其為const類型。則表明其是一個(gè)常量函數(shù)。不能修改類的成員變量。
5)對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為const類型。以使得其返回值不為“左值”。
static關(guān)鍵字:
1)函數(shù)體內(nèi)static變量的作用范圍為函數(shù)體。不同于auto變量。該變量的內(nèi)存只被分配一次。因此其值在下次調(diào)用時(shí)仍維持上次的值。
2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)的所有函數(shù)訪問。但不能被模塊外的其他函數(shù)訪問。
3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。這個(gè)函數(shù)的使用范圍被限制在聲明它的模塊內(nèi)。
4)在類中的static成員變量屬于整個(gè)類所有,對(duì)類的所有對(duì)象只有一份復(fù)制。
5)在類中的static成員函數(shù)屬于整個(gè)類所有,這個(gè)函數(shù)不接受this指針,因而只能訪問類的static成員變量。
總結(jié)
- 上一篇: 《JS权威指南学习总结--9.5 类和类
- 下一篇: 使用ros发布UVC相机和串口IMU数据