C 語法特點

2023-01-30 17:54:04 字數 4317 閱讀 9042

較c的一些優點

封裝性:把資料和運算元據的函式組織在一起,不僅使程式結構緊湊,並且提高了類內部的安全性

繼承性:增加了軟體可擴充性和**重用性。

多型性:使設計人員對問題可以進行更好的抽象,有利於**維護和重用。

2.結構體

c語言中結構體不能包含函式。在物件導向的程式設計中,物件具有狀態(屬性)和行為,狀態儲存在成員變數中,行為通過成員方法(函式)來實現。c語言中的結構體只能描述乙個物件的狀態,不能描述乙個物件的行為。

在c++中,對結構體進行了擴充套件,c++結構體可以包含函式。

例 #include <

struct point

};void mian()

上段程式說明:

開始定義了乙個結構體point定義,注意是c++的結構體,所以除了定義成員變數x、y之外,同時定義了output()這個結構體函式。在c中這種定義是錯誤的,不能有函式出現。在程式中第一次輸出x、y是利用標準輸出函式,第二次是利用結構體自身函式。

在c++中預定義了三個標準輸入輸出流物件:cin、cout、cerr、cin與輸入操作》一起用於標準輸入讀入資料,cout與輸出操作符<<;一起用於輸出資料到標準輸出上,cerr與輸出操作符<<;一起用於輸出錯誤資訊到標準錯誤上。使用cin和cout不需要去考慮輸出和輸出的資料的型別,cin和cout可以自動根據資料的型別標準調整輸入輸出的格式。

endl表示換行,相當於c語言中的「/n」,它在輸出流中插入乙個換行並且重新整理輸出緩衝區。

2.類將上貼point結構體定義中的關鍵字struct換成class,得到

class point

};這就是c++中類的定義,於結構體很類似。在c++中,結構體使用關鍵字struct宣告的類。類和結構體的定義除了使用關鍵字「class」和「struct」之外,更重要的是在成員的訪問控制方面有所差異。

結構體預設情況下,其成員是公有的;類預設情況下,其成員是私有的。在乙個類當中,公有成員是可以在類的外部進行訪問的,而私有成員就只能在類的內部進行訪問了。

3.建構函式

建構函式的功能是對類中的成員變數進行初始化。在類中定義成員變數時,不能直接給成員變數賦初值。

例: #include <

class point

void output()

};void main()

建構函式的作用是對物件本身做初始化工作,也就是給使用者提供初始化類中成

員變數的一種形式。可以在建構函式中編寫**,對類中的成員變數進行初始化。如此例當main()中執行「point pt」時,就會自動呼叫point這個類的建構函式,從而完成對pt物件內部資料成員x和y的初始化工作。

如果乙個類中沒有定義任何的建構函式,那麼c++編譯器在某些情況下會為該類提供乙個預設的建構函式,這個預設的建構函式是乙個不帶引數的建構函式。只要有乙個類中定義了乙個建構函式,不管這個建構函式是否是帶引數的建構函式,c++編譯器都不再提供預設的建構函式。也就是說,如果為乙個類定義了乙個帶引數的建構函式,還想要無引數的建構函式,則必須自己定義。

4.析構函式當乙個物件的生命週期結束時,需要去釋放這個物件所占有的資源。即析構函式的功能。

~類名。析構函式是反向的建構函式。析構函式的作用剛好和建構函式相反,析構函式用於清除類的物件。

當乙個類的物件超過它的作用範圍,物件所在的記憶體空間被系統**,或者在程式中用delete刪除物件時,析構函式將自動被呼叫。對乙個物件來說,析構函式是最後乙個被呼叫的成員函式。

class student

point(int a,int b)

void output()

point(int a,int b)

void output

執行結果是animal breathe(這叫upcasting)

在fish類中重新定義了breathe()方法,採用bubble方式。接著定義了乙個全域性函式fn(),指向animal類的指標作為fn()函式的引數。在main()函式中,定義了乙個fish類的物件,將它的位址賦給了指向animal類的指標變數pan,然後呼叫fn()函式。

這裡,c++編譯器自動將fish型別的物件轉換成了animal類的物件,即其this指標去掉了fish物件增加的部分,只保留了animal的物件部分。當構造fish類的物件時,首先要呼叫animal類的建構函式去構造animal類的物件,然後才呼叫fish類的建構函式完成自身部分的構造,從而拼接出乙個完整的fish物件。當我們將fish類物件轉換為animal型別時,該物件就被認為是原物件整個記憶體模型的上半部分,即animal物件所佔記憶體。

當我們利用型別轉換後的物件指標去呼叫它的方法時,自然也就是呼叫它所在的記憶體中的方法。

如果想使結果顯示為fish bubble,則要這麼修改,在animal類的breathe()前加virtual

virtual void breath

e(){ cout<<"animal breathe"<而在派生類中隱藏了基類的同名函式。注意以下兩種情況:

(1)派生類的函式與基類的函式完全相同(函式名與引數列表均相同),只是基類的函式沒有使用virtual關鍵字。此時基類的函式將被隱藏而不是覆蓋

(2)派生類的函式與基類的函式同名,但引數列表不同,在這種情況下,不管基類的函式宣告是否有virtual關鍵字,基類的函式都將被隱藏。注意這種情況與函式過載的區別,過載發生在同乙個類中。

函式的覆蓋是發生在派生類和基類之間,兩個函式必須完全相同,並且都是虛函式。不屬於這種情況的,就是隱藏了。

#include <>

class base

{ public:

virtual void xfn(int i)

{ cout<<"base::xfn(int i)"

pd->xfn(5);

pb->yfn(3.14f);

pd->yfn(3.14f);

pb->zfn();

pb->zfn12引用引用就是乙個變數的別名,它需要用另乙個變數或物件來初始化自身。

int a=5;

int &b=a;//用&表示宣告乙個引用。引用必須在宣告時進行初始化引用和用來初始化引用的變數指向的是同一塊記憶體,因此通過引用或者變數可以改變同一塊記憶體中的記憶體。引用一旦初始化,它就代表了一塊特定的記憶體,再也不能代表其他的記憶體。

引用只是乙個別名,是乙個變數或物件的替換名稱。引用的位址沒有任何意義,因此c++沒有提供訪問引用本身位址的方法。引用的位址就是它所引用的變數或者物件的位址,對引用的位址所做的操作就是對被引用的變數或物件的位址所做的操作。

指標是位址,指標變數要儲存位址值,因為要占用儲存空間,我們可以隨時修改指標變數所儲存的位址值,從而指向其他的記憶體。

引用多數用在函式的形參定義上,在呼叫函式傳參時,我們經常使用指標傳遞,一是避免是在實參佔較大記憶體時發生值的複製,二是完成一些特殊的作用。

#include <>

//change函式主要用來交換a和b的值

void change(int &a,int &b);

void main()

{ int x=5;

int y=3;

cout<<"original x="和""表示編譯器在搜尋檔案時的順序不同,<>表示從系統目錄下開始搜尋,然後再搜尋path環境變數所列出的目錄,不搜尋當前目錄;""是表示先從當前目錄搜尋,然後是系統目錄和path環境變數所列出的目錄。所以如果我們知道標頭檔案在系統目錄下,就可以直接<>,這樣可以加快搜尋速度。

::叫做作用域識別符號,用於指明乙個函式屬於哪乙個類或乙個資料成員屬於哪乙個類。::前面如果不跟類名,表示是全域性函式或全域性資料。

C語言語法知識

4.1c語句概述 一 乙個函式包括宣告部分和執行部分 語句 二 c語句可以分為以下5類 1 控制語句,完成一定的控制功能。c只有9種控制語句,它們是 if else 條件語句 for 迴圈語句 hile 迴圈語句 do hile 迴圈語句 continue 結束本次迴圈語句 break 中止執行sw...

日語語法結構的特點

分類五段活用動詞 五段 詞尾乙個,均在 段上 一段活用動詞 一段 上一段 段仮名 下一段 段仮名 詞尾兩個 變活用動詞 變 變活用動詞 變 來 活用形未然形連用形終止形連體形 假定形命令形 推量形 未用終體假令推 今日本日 明日 昨日一昨日 明後日休 春休 新學期4月1日 夏休 冬休 月何月 日 何...

c語言宣告的語法

概述 在很多情況下,尤其是讀別人所寫 的時候,對c語言宣告的理解能力變得非常重要,而c語言本身的凝練簡約也使得c語言的宣告常常會令人感到非常困惑,因此,在這裡我用一篇的內容來集中闡述一下這個問題。問題 宣告與函式 有一段程式儲存在起始位址為0的一段記憶體上,如果我們想要呼叫這段程式,請問該如何去做?...