C 一些要點

2021-06-08 14:11:38 字數 3835 閱讀 9303

1. 傳指標時,我們可以通過指標來修改它在外部所指向的內容。但如果要修改外部指標所指向的物件是不可能的。例如傳遞外部指標到函式內來分配空間,必須傳遞指標的指標或指標的引用。

2.char carry[10] = ; 編譯器會將其後所有的東西都置0;

3. 函式返回值為const時,返回的東西付給乙個型別相同的標示後其不能為左值;

4.const int *i;

int const *i;

int * const i;

前兩個功能相同,說明i所指向的內容不變;最後乙個說明指標指向的位址不變,但內容可變。

5. 類中的const成員函式。定義為在原型後加const。常量函式不能修改類中的任何屬性。但有兩種方法可以修改。

a) b) 將乙個成員定義成mutable即可被常量函式修改。

6. 類中的常量const 型別的,不能在類中被用來定義陣列。

而enum ; 定義的one、two卻可以。通常的enum定義的置分配問題:

enum a; 此時z的值為10。

7. 用const定義的int可用來開闢陣列,但const定義的常量陣列中的元素,不能用來定義陣列。

8. 用sizeof計算變數的空間,如果是陣列,按實際空間返回;常量字串(實際上是在靜態記憶體區開闢的變數)sizeof返回比實際長度加一。如果是指標則不考慮它指向的空間大小,僅僅返回指標型別的大小。如果用sizeof計算函式的行參,即使是屬組也僅僅返回乙個相關型別指標的大小。

9. 形如

int iarray = ; 編譯器會自動給iarray分配3個元素的長度。元素長度的個數計算公式為sizeof(iarray) / sizeof(*iarray)。

10. 拷貝建構函式:當行參和實參結合時,如果是複雜物件的傳值型別,則呼叫拷貝建構函式生成乙個臨時物件作為實參,退出函式時,臨時物件被呼叫析構函式釋放。當返回值是複雜物件是,也是呼叫拷貝建構函式來賦值。這就出現建構函式和析構函式被呼叫次數不相等的情況。拷貝建構函式的原型為a(a&),我們可在類中過載。(預設的拷貝建構函式是使用位(bit)拷貝方法:淺層拷貝,不拷貝指標指向的內容)。

11. volatile型別的變數告訴編譯器,本變數不需要進行**優化。在多執行緒的應用中,我們如果讀入乙個變數到暫存器,此時時間片到期,去處理其他執行緒了,在重新獲得處理機時,volatile型別告訴處理機,重新從變數讀取資料到暫存器,而不是用暫存器資料直接處理,這樣可以防止髒資料。

12. class 和struct在一定程度上有相同的功能,只不過前者預設的成員是私有的,後者在預設時成員為共有的。故而class不是c++必需的保留字

13. c和c++編譯器,對相同的函式名編譯後生成的相同的標示不同,故而在引用c的庫檔案時必須使用extern 「c」告訴編譯器,它是c的函式,按c的規則編譯。通常我們使用的標準標頭檔案已被處理過。

14.#include 「filename」;

#include ,

前者先在當前目錄下尋找檔案,如果找不到再到系統規定的路徑下找,後者直接到系統規定的路徑下找。

15. 任何地方分配的靜態變數(static),其生命週期和主程序相同。第二次定義乙個已存在的static變數,對變數的內用無影響,但它的可見範圍只在定義的範圍內。(考研曾作錯!)(從靜態變數的特性不難理解,類中的static型別是所有物件共享的)

16. 內聯函式(inline)在實現上實際和巨集類似,在內聯函式出現的地方將函式展開來避免函式呼叫時的出棧、如棧,提高效率。但內聯函式的代價是:**增大。inline函式適合成員函式和自由函式。在類中實現的函式自動為內聯函式。inline必須定義到函式的實現上,例如:inline int plusone(int) 是無效的。友元函式在類的體內被實現自動變為內聯函式。

17. #include

#define debug(x) cout<<#x"="《其中的#x表示x被當作字串輸出。

18. assert(0 != 0); 如果assert中的條件為假,則執行期間回退出程式,且報告出錯**的行號。(#include )

19. 靜態物件在main結束或exit()被呼叫時才呼叫自身的析構函式。這意味著,在物件的析構函式中呼叫exit()是很危險的,有可能進入乙個死迴圈中。呼叫abort()來退出函式,靜態物件的析構函式並不會被呼叫。我們可以用atexit()來指定跳出main或呼叫exit時要執行的操作,用atexit註冊的函式,可以在所有物件的析構函式之前呼叫。

void exit_fn2(void)

printf("exit function #2 called\n");

//處理函式

atexit(exit_fn2);

20. 全域性變數實際上用的是靜態儲存。靜態變數的構造是在進入main之前呼叫的,在main結束時呼叫它的析構函式。變數的名字由小範圍(c++而言):

//*.cpp

int a; //靜態變數,但為 extern int a; 即它是全域性的,外部可見的

static int b; //靜態變數,static 和extern相反,只在*.cpp中有效,對其他單元(檔案)是不可見的。函式的定義和上面相同。

main() 類的靜態成員變數可以如下賦值:

int x::s=23;(在*.cpp中,無**私都可以)

21. 名字空間(namespace): 定義乙個名字空間,然後使用unsing就可以將當前的型別上下文轉換名字空間所定地的.

namespace math

enum sign;

class integer;//end class interger a, b, c;

interger divide(interger, interger);

}//no ;

void q()

using namespace math;

interger a; //hides math::a a.sign(negative);

math::a.sign(positive);

22. 一般對於函式flaot f(int a, int b); 某些c++編譯器編譯後生成_f_int_int的名字,有些c編譯器則生成_f的名字。故在c++中鏈結c的庫函式時要用extern 「c」告訴編譯器,按c的規則來編譯函式。類似的還有extern 「c」,c++還支援extern 「c++」{}.

23. 在函式呼叫時,傳引用也是將指標壓棧。

24. 建構函式、析構函式、賦值建構函式、過載的=,四者的呼叫順序:(三種函式都已實現)

a)x x; x a=x;

result:

x:construct

x:copy_struct b)

x x; x a; a=x;

result:

x:construct

x:construct

x:copy_stru

operator ==x:destruct

如果沒有賦值建構函式則結果:

x:construct

x:construct

operator =

x:destruct (

如果直接x a=x;這不掉用一般的建構函式,呼叫複製建構函式)

指向類的成員函式的指標:設 int x:: a(void){}

x x; int (x:: *pf)(void)= &x::a; (x.*pf)(); 指向成員變數的指標: 設int i; 是x的成員變數

int x::*pm = &x::i; x x

25.c++中如果要使用全域性變數,最好在cpp中定義,然後在相應的h檔案中,extern一下就可以

26.相互包含問題

在a.h裡面加上#include "b.h",這樣就能保證b能在a.h和a.cpp中正常使用。

在b.h裡面的class b前面加上class a;可以保證a在b.h裡面正常使用,在b.cpp裡面加上#include "a.h"就可以保證在b.cpp中使用了。

js一些要點

js中 undefined null true false null false false undefined false undefined null false true 任意物件 返回右邊的任意物件 關於js立即執行函式 function function aa 這樣不會執行並且丟擲異常 f...

VC 一些要點記錄

本次記錄c 的幾個要點,關於visual studio 2017.說明 visual studio 2017 比visual studio 2015 有了很大的提公升,更快的 編譯速度,更輕便的安裝方式。所以公升級這個是很有必要的,但是往往我們很多公用的編譯環境是用vc14 進行構建的,而visua...

記錄一些網路程式設計要點

1,tcp ip協議族分層結構 應用層 http,ftp.傳輸層 tcp,udp 網路層 ip 資料鏈路層。2,socket是對tcp ip協議中 傳輸層和網路層的抽象 封裝 可以 用層直接使用。有乙個形象的比喻,http比喻為一輛轎車,socket比喻為一台發動機。3,ip協議本身決定了其不可靠傳...