天天看點

Nowcoder專項練習:C++(十一)

1,初始化與未初始化資料段

Q:

void func()
{
  static int val;
  …
}
           

中,變量val的記憶體位址位于?

A:

  • 未初始化數的據段

初始化的全局變量和靜态變量存放在 data段(全局初始化區)

未初始化的全局變量和未初始化的靜态變量存放在bss段(全局未初始化區),其中BSS段的特點是:

  • 在程式執行之前BSS段會自動清0,是以未初始化的全局變量和靜态比那輛在程式執行之前就已經變成0,但是并不是存放在初始化段,是因為存放在未初始化段才初始化為0的。

2,構造順序

假如說D繼承自B,則基類的構造函數會先執行。

而C是D的成員函數,那麼在D的構造函數執行之前,會對其進行初始化,先執行C的構造函數。

以B、C、D,可以看做帶有構造函數的類。

3,數組定義方式

Q:

在C語言中,一維數組的定義方式為:

元素類型 數組名 [E]

其中,E為?

A:

  • 整型常量表達式

整型常量表達式可以的,比如3+3,但是整型表達式不可以,比如n+n就是錯誤的。

4,傳遞參數

  • 指針

    傳位址,對形參的操作就是對實參的操作。

  • 引用

    形參作為實參的别名,是以實質上也是對實參的操作。

  • 傳值

    如果沒有傳回值,對形參的操作并不會引起實參的變化。

5,位元組對齊

位元組對齊的三個準則:

  1. 結構體變量的首位址能夠被其最寬基本類型的成員的大小整除;
  2. 結構體每個成員相對于結構體首位址的偏移量都是成員大小的整數倍,如果有需要,編譯器會在成員之間填充位元組;
  3. 結構體的總大小為結構體最寬節本類型成員大小的整數倍,如果有需要,編譯器會在最末一個成員之後加上填充位元組。

6,類型的混合運算

Q:

設在程式中 a、b、c 均被定義成整型,所賦的值都大于 1,則下列 C++ 表達式能正确表示右圖所示代數式的是?(假設abc不超出整型表示的範圍)、

Nowcoder專項練習:C++(十一)

A. 1.0/(abc)

B. 1/(abc)

C. 1/a/b/(float)c

D. 1.0/a/b/c

A:

正确答案為AD

對于C選項,1/a/b/(float)c,由于除法運算的結合方向是從左到右,先算1/a,因為a的值大于 1,結果為0,之後再除b和c結果還是0。

7,指針的指針

Q:

閱讀下面代碼,程式會列印出來的值是?

#include <stdio.h>
void f(char**p){
      *p +=2;
}
main()
{
    char *a[] = {"123","abc","456"},**p;
    p = a;
    f(p);
    printf("%s\r\n",*p);
}
           

A:

在上面的代碼中,*p指向的是字元串“123”的第一個元素,即‘1’,指針p向後移動兩個元素的位址,即指向‘3’。

而 *(p+2)才是基于p每次向後移動一個字元串的長度,即 *(p+2)指向的是“456”。

Nowcoder專項練習:C++(十一)

8,運算符重載

  • 一般情況下,單目運算符最好重載為類的成員函數;雙目運算符則最好重載為類的友元函數。
  • 以下一些雙目運算符不能重載為類的友元函數:=、()、[]、->。
  • 類型轉換函數隻能定義為一個類的成員函數而不能定義為類的友元函數。 C++提供4個類型轉換函數:reinterpret_cast(在編譯期間實作轉換)、const_cast(在編譯期間實作轉換)、stactic_cast(在編譯期間實作轉換)、dynamic_cast(在運作期間實作轉換,并可以傳回轉換成功與否的标志)。
  • 若一個運算符的操作需要修改對象的狀态,選擇重載為成員函數較好。
  • 若運算符所需的操作數(尤其是第一個操作數)希望有隐式類型轉換,則隻能選用友元函數。
  • 當運算符函數是一個成員函數時,最左邊的操作數(或者隻有最左邊的操作數)必須是運算符類的一個類對象(或者是對該類對象的引用)。如果左邊的操作數必須是一個不同類的對象,或者是一個内部 類型的對象,該運算符函數必須作為一個友元函數來實作。
  • 當需要重載運算符具有可交換性時,選擇重載為友元函數。
  • 運算符重載并不會定義新的運算符。
  • 若重載運算符+,則相應的運算符函數名是operator+。
  • 二目運算符重載為類成員函數時 由于this指針的作用,函數參數會少一個。

9,檔案操作

打開方式 說明
r 以隻讀方式打開檔案,該檔案必須存在。
r+ 以讀/寫方式打開檔案,該檔案必須存在。
rb+ 以讀/寫方式打開一個二進制檔案,隻允許讀/寫資料。
rt+ 以讀/寫方式打開一個文本檔案,允許讀和寫。
w 打開隻寫檔案,若檔案存在則長度清為0,即該檔案内容消失,若不存在則建立該檔案。
w+ 打開可讀/寫檔案,若檔案存在則檔案長度清為零,即該檔案内容會消失。若檔案不存在則建立該檔案。
a 以附加的方式打開隻寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留(EOF符保留)。
a+ 以附加方式打開可讀/寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,則寫入的資料會被加到檔案尾後,即檔案原先的内容會被保留(原來的EOF符不保留)。
wb 以隻寫方式打開或建立一個二進制檔案,隻允許寫資料。
wb+ 以讀/寫方式打開或建立一個二進制檔案,允許讀和寫。
wt+ 以讀/寫方式打開或建立一個文本檔案,允許讀寫。
at+ 以讀/寫方式打開一個文本檔案,允許讀或在文本末追加資料。
ab+ 以讀/寫方式打開一個二進制檔案,允許讀或在檔案末追加資料。

10,友元函數重載

  • 友元函數重載時,參數清單為1,說明是一進制運算符,為2則說明是二進制運算符。因為沒有this指針指向對象,是以參數個數保持和原來一樣。
  • 成員函數重載時,參數清單為空,說明是一進制運算符,為2則說明是二進制運算符。