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