近期知識點集合

1.指針變量p進行自加運算(即 執行p++;)後,地址偏移值爲1,則其 數據類型爲 char。說法是否正確?

解析:錯誤

class A

{

};

對於一個什麼都沒有的類,字節也爲1。

 

2.c語言中耦合度含義

模塊間的耦合性就是指當修改其中某個模塊時會影起其他模塊運行結果發生不可預料的變化。如果模塊間是通過直接調用對方內部的全局變量來實現交互,則兩個模塊間的耦合性將會變得複雜而且難以控制。而模塊間的交互通過一個統一的接口函數來實現,使得模塊都無需知道對方模塊內部的具體實現(這也就是面向對象裏面的封裝)。當某個模塊內的實現發生改寫或升級時,只要確保模塊接口不變即可。這就大大降低兩模塊間的耦合。在規劃設計模塊時就應認真考慮好模塊的接口,以及與其他模塊的調用關係。所以要記住編程原則:針對接口編程,而不是針對實現。

 

3.十進制變量i的值爲100,那麼八進制的變量i的值爲?

解析:144

十進制 100=64+32+4 ==1*8^2+4*8^1+4*8^0 ==>144八進制

對於數值小的用湊數法比較快捷

數值大的:

100%8=4100/8=12;

12%8=4;12/8=1;

1%8=1;1/8=0;所以結果是144

 

4.以下代碼的運行結果爲:

class Base {

public:

Base() {echo();}

virtual void echo() {printf(“Base”);}

};

 

class Derived:public Base {

public:

Derived() {echo();}

virtual void echo() {printf(“Derived”);}

};

  

int main() {

Base* base = new Derived();

base->echo();

return 0;

}

 

解析:

Base

Derived

Derived

Base* base = new Derived();

 

//首先將上面的語句分成兩部分:

//前一部分是基類指針指向子類對象實現動態綁定,後一部分是new了一個子類對象;

//語句執行時,先執行後一部分new Derived()這句話,它會調用Derived() {echo();}

//而執行派生類的構造函數時,會先去執行基類的構造函數,所以會調用Base() {echo();},此時不涉及到虛函數的動態綁定,

//因爲我們現在才執行了後一部分,還沒有動態綁定,所以正常調用基類的echo()函數,執行完後返回到子類的構造函數,執行子類的echo();

//然後執行前一部分,實現虛函數的動態綁定。

base->echo();

//此時考察的就是虛函數的使用了,基類echo申明爲虛函數,所以調用時會去子類尋找對應的虛函數執行。

 

5.在c++中的結構體是否可以有構造函數?

解析:

可以有

 

二者的默認訪問權限和默認繼承屬性不一樣

是默認公有繼承和訪問私有的

結構體是默認私有繼承和訪問公有的

 

6.此題注意一點(沒做錯)

#include<iostream>

using namespace std;

 

class Base

{

    int x;

public:

    Base(int b): x(b) {}

    virtual void display()

    {

        cout << x;

    };

};

class Derived: public Base

{

    int y;

public:

    Derived(int d): Base(d), y(d) {} void display()

    {

        cout << y;

    }

};

 

int main()

{

    Base b(1);

    Derived d(2);

    Base *p = & d;

    b.display();

    d.display();

    p->display();

    return 0;

 

}

解析:122

Base *p = & d是把 派生類對象的地址&d賦值給指向基類對象的指針變量p。

通過指向基類對象的指針只能訪問派生類中的基類成員,而不能訪問派生類增加的成員

 

7.知識點

如在定義局部變量時不賦值的話,

則對靜態變量來說,編譯時自動賦初值0空字符

而對自動變量來說,如果不賦值,它的值是一個不確定的值

 

8.知識點

如果不指定函數類型,系統會隱含指定函數類型爲int

 

9.知識點

在創建派生類對象時,構造函數的執行順序是:

基類構造函數→對象成員構造函數→派生類本身的構造函數

 

10.運行以下 C 語言代碼,輸出的結果是

 

解析:stra tra ra

相當於把str[0]看成一個獨立的字符串,然後char *p=str[0],一個p指針指向它,很容易就得出來了

 

11.知識點

實型 字面值常量 有兩種表示方式:小數形式 和 指數形式

小數形式

由最前面的額正負號,數字0-9和小數點組成,不允許有其他符號;

指數形式

包括指數尾數兩個不可缺少的部分,用符號E(e)分割

E(e)左邊是尾數,爲十進制整數或小數形式的實數,

E(e)右邊爲指數必須爲十進制整數,表示乘以10的多少次方

 

12.知識點

論一個漢字佔用的字節數,那麼 UTF-8 佔用3個字節, UTF-16 佔用2個字節。

文檔最後的結束符號 也需要+2和+3

 

13.字符串賦值 char str[80]; str="abcdefg"是否正確?

解析:

數組名爲指針常量,不能更改

數組名是不可以更改的。

const char* str; str="abcdefg";這樣寫就是正確的,或者char str[80]="abcdefg";

 

14.遇到的最坑的題

以下程序段的輸出結果是?

char str[] = "ab\012\\n";

printf("%d", strlen(str));

 

解析:5

這題有個很大的陷阱,

\012是表示八進制數10,也就是ASCII碼對應的\n符號。

\\表示一個字符,斜槓

並且strlen結果不算字符串結束符,所以答案爲5.

 

15.知識點

C 語言中的文件類型只有 ASCII碼文件 和 二進制文件 兩種

 

16.知識點

函數的定義不可以嵌套,函數的調用可以嵌套

 

調用嵌套都知道,關於定義嵌套,我首先想到了遞歸:

遞歸不就是在函數的定義的時候使用的嗎?——是的!

但使用遞歸,其實是一種函數嵌套調用,因爲遞歸在函數內部使用的時候就一句話,而不是定義。

~

所以,函數可以嵌套調用,而不可以嵌套定義。

 

17.函數func的定義如下:

void func(const int& v1, const int& v2)

{

    std::cout << v1 << ' ';

    std::cout << v2 << ' ';

}

 以下代碼在vs中輸出結果爲____。

int main (int argc, char* argv[])

{

    int i=0;

    func(++i,i++);

    return 0;

}

解析:2 0

C語言函數參數入棧順序爲由右向左,

func(++i, i++)可以分解爲

參數 i 先入棧 輸出0

然後執行i++ 此時i爲1

接着參數 i 先執行++i   i 此時爲2  後入棧進行輸出 2

 

18.開發C代碼時,經常見到如下類型的結構體定義:

typedef struct list_t

{

struct list_t *next;

struct list_t *prev;

char data[0];

}list_t;

最後一行char data[0];的作用是?

 

解析:

方便管理內存緩衝區

減少內存碎片化

 

19.知識點

19.1  死代碼的含義是指永遠不會被執行到的代碼段

 

19.2  strlen是根據ascii碼爲0的字符來判斷是否結束的,'\0'的ascii碼爲0,是結束符;0本身的值就是0,所以也被看做結束符

 

19.3

1.編輯:也就是編寫C/C++程序。

2.預處理:相當於根據預處理指令組裝新的C/C++程序。經過預處理,會產生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出文件,這個文件的含義同原本的文件無異,只是內容上有所不同。

3.編譯:將預處理完的文件進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的彙編代碼文件。

4.鏈接:通過鏈接器將一個個目標文件(或許還會有庫文件)鏈接在一起生成一個完整的可執行程序。 鏈接程序的主要工作就是將有關的目標文件彼此相連接,也就是將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成爲一個能夠被操作系統裝入執行的統一整體。在此過程中會發現被調用的函數未被定義。

 

19.4  float指數位8位,指數範圍-128至127 。小數位23位

所以float 類型(即 IEEE754 單精度浮點數格式)能表示的最大整數是

2^128-2^104

 

19.5  取餘兩邊都必須爲整數

 

 

對象成員構造函數:

一個類的對象可以作爲另一個類的數據成員,此時把該對象稱爲類的對象成員。

 

當一個類中出現對象成員時,該類的構造函數就要爲對象成員初始化,對象成員的初始化必須在構造函數的初始化表中完成。

注意:

初始化對象成員時必須用對象成員名,而不是它的類型名。例如:

class Date

{

    int year, month, day;

    Date(int y, int m, int d)

    {

        year = y;

        month = m;

        day = d;

    }

};

 

class Person

{

    char name[12];

    char sex[4];

    Date birthday;

 

public:

    Person(char*, char*, int, int, int);

    ……

};

 

Person:Person(char *n, char *s, int y, int m, int d):birthday(y, m ,d)

 

{

    strcpy(name, n);

    strcpy(sex, s);

}

此處使用birthday(y, m, d),不能使用Date(y, m, d)。

 

若一個類包含對象成員,在建立該類的對象時,先調用對象成員的構造函數,初始化相應的對象成員,然後才執行該類的構造函數。

 

如果一個類包含多個對象成員,對象成員的構造函數的調用順序由它們在該類中的說明順序決定,而它們在初始化表中的順序無關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章