c 語法小知識2

2021-09-30 12:47:52 字數 1894 閱讀 6868

1.operator的初步認識。

operator是c++中的關鍵字,是乙個過載操作符,為什麼要使用過載操作符呢?

對於系統的所有操作符,一般情況下,只支援基本資料型別和標準庫中提供的class,對於使用者自己定義的class,如果想支援基本操作,比如比較大小,判斷是否相等,等等,則需要使用者自己來定義關於這個操作符的具體實現。比如,判斷兩個人是否一樣大,我們預設的規則是按照其年齡來比較,所以,在設計person 這個class的時候,我們需要考慮操作符==,而且,根據剛才的分析,比較的依據應該是age。那麼為什麼叫過載呢?這是因為,在編譯器實現的時候,已經為我們提供了這個操作符的基本資料型別實現版本,但是現在他的運算元變成了使用者定義的資料型別class,所以,需要使用者自己來提供該引數版本的實現。

例如:struct book;

struct student st1 = ;

struct student st2 = ;

我們要判斷是兩個結構體物件是不是相等,用尋常的操作符」==「不能用作於比較:st1 == st2?

如果我們過載"==」為:

bool operator == (struct book s, struct book q)

else

}void main()

這是可以執行的,但是如果沒有上邊的過載,是不能直接這麼用的。

具體:2.在c++中,指標和引用經常用於函式的引數傳遞,然而,指標傳遞引數和引用傳遞引數是有本質上的不同的:

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。(這裡是在說實參指標本身的位址值不會變)

而在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

引用傳遞和指標傳遞是不同的,雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標的指標,或者指標引用。

為了進一步加深大家對指標和引用的區別,下面我從編譯的角度來闡述它們之間的區別:

程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改。

最後,總結一下指標和引用的相同點和不同點:

★相同點:

●都是位址的概念;

指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名。

★不同點:

●指標是乙個實體,而引用僅是個別名;

●引用只能在定義時被初始化一次,之後不可變;指標可變;引用「從一而終」,指標可以「見異思遷」;

●引用沒有const,指標有const,const的指標不可變;(具體指沒有int& const a這種形式,而const int& a是有     的,  前者指引用本身即別名不可以改變,這是當然的,所以不需要這種形式,後者指引用所指的值不可以改變)

●引用不能為空,指標可以為空;

●「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;

●指標和引用的自增(++)運算意義不一樣;

●引用是型別安全的,而指標不是(引用比指標多了型別檢查)

python語法小知識

1,關鍵字傳參 coding utf 8 def f a,b,c 3,d 4 print a,b,c,d print f 1,2,c 5,d 6 print f 1,2,d 5,c 6 print f a 3,b 4 print f b 4,a 3 print f d 4,c 3,b 2,a 1 p...

《C語言語法知識》 小知識點彙總

在使用 關係運算子時,為了避免會誤寫為賦值符號 而無法被檢測出錯誤,將值放在運算子左側,變數放在運算子右側,如if y value 這樣當誤寫時編譯器就會報錯。do while迴圈先執行迴圈體中的內容,然後判斷while後表示式的值,若為真,再次執行迴圈體,若為假,則跳出迴圈。注意 do while...

JavaSE語法小知識彙總

public class testvar3 system.out.println c double b 3.14 system.out.println b float f int 3.3333333333f double main 3.56756757657657657657667867676786...