C 語言總結 一

2021-08-01 17:15:32 字數 3785 閱讀 8926

c++語言是在c語言基礎之上,新增了物件導向、模板等現代程式語言的特性而發展起來的。兩者無論是從語法規則上,還是從運算子的數量和使用上,都非常相似。

c語言和c++並不是對立的競爭關係:

頭檔案型別

約定示例

說明c++舊式風格

以.h結尾

iostream.h

c++程式可用

c舊式風格

以.h結尾

math.h

c/c++程式可用

c++新式風格

無副檔名

iostream

c++程式可用,使用namespace std

轉換後的c

加上字首c,無副檔名

cmath

c++程式可以,可使用非c特性,如namespace std

在c++中,名稱可以是符號常量、變數、巨集、函式、結構、列舉、類和物件等等。為了避免,在大規模程式的設計中,以及在程式設計師使用各種各樣的c++庫時,這些識別符號的命名發生衝突,標準c++引入了關鍵字namespace,可以更好的控制識別符號的作用域。
建立乙個命名空間

namespace a

namespace b

void test()

命名空間只能在全域性範圍內定義

命名空間可巢狀命名空間

命名空間是開放的,即可以隨時把新的成員加入到已有的命名空間中

宣告和實現可以分開

無命名空間,意味著命名空間中的識別符號只能在本檔案內訪問,相當於給這個識別符號加上了static,使其可以作為內部鏈結

命名空間別名:namespace shortname = verylongname

把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。

類將成員變數和成員函式封裝在類的內部,根據需要設定訪問許可權,通過成員函式管理內部狀態。

多型性可以簡單的概括為「乙個介面,多種方法」,字面意思為多種形態,程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。

c中定義結構體變數需要加上struct關鍵字,c++不需要

c中的結構體只能定義成員變數,不能定義成員函式,c++即可以定義成員變數,也可以定義成員函式

struct student

//c++既可以成員變數,也可以定義成員函式

void setage(int age)

void showstudent()

};void test01()

c++具有更嚴格的型別轉換,在c++中,不同型別的變數一般是不能直接賦值的,需要相應的強轉。

在c語言中三目運算表示式返回值為資料值,為右值,不能賦值。

在c++語言中三目運算表示式返回值為變數本身,為左值,可以賦值。

(a > b ? a : b ) = 100;

在c++中,乙個const不必建立記憶體空間,而在c中,乙個const總需要一塊記憶體空間。而在c中,乙個const總需要一塊記憶體空間。在c++中,是否為const常量分配記憶體空間依賴於如何使用,一般來說,如果乙個const僅僅用來把乙個名字用乙個值代替,那麼該儲存空間就不必建立。

如果儲存空間沒有分配記憶體,在進行完資料型別檢查後,為了**更加有效,值也許會摺疊到**中。

c語言全域性const會被儲存在唯讀資料段。c++中全域性const當宣告extern或者對變數取位址時,編譯器會分配儲存位址,變數儲存在唯讀資料段,兩個都受到了唯讀資料段的保護,不可修改。

c語言中區域性const儲存在堆疊區,只是不能通過變數直接修改const唯讀變數的值,但是可以跳過編譯器的檢查,通過指標間接修改const值。

在程式編寫時,盡量使用const替換#define

const和#define區別總結

引用是c++對c的重要擴充。在c/c++中指標的作用基本都是一樣的,但是c++增加了另一種給函式傳遞位址的途徑,這就是引用傳遞,它也存在於一些其他程式語言當中,並不是c++的發明。

type &ref = val;

c++編譯器在編譯過程中使用常指標作為引用的內部實現,因此引用所占用的空間大小與指標相同,只是這個過程是編輯內部實現,使用者不可見。

常量引用主要應用在函式的形參,尤其是類的拷貝/複製建構函式

將函式的形參為常量引用的好處

在c中我們經常把一些短並且執行頻繁的計算寫成巨集,而不是函式,這樣做的理由是為了執行效率,巨集可以避免函式呼叫的開銷,這些都由預處理來完成。

在c++中,使用預處理會出現兩個問題:

為了保持預處理巨集的效率又增加安全性,而且還能像一般成員函式那樣可以在類裡訪問自如,c++引入了內聯函式(inline function)

內聯函式為了繼承巨集函式的效率,沒有函式呼叫時的開銷,然後又可以像普通函式那樣,可以進行引數,返回值型別的安全檢查,又可以作為成員函式。

預處理巨集的缺陷

#define add(x,y) x+y

inline int add(int x,int y)

void test()

在c++中,預定義的概念是用內聯函式來實現的,而內聯函式本身也是乙個真正的函式。內聯函式具有普通函式的所有行為。唯一不同之處在於內聯函式會在適當的地方像預定義一樣展開,所以不需要函式呼叫的開銷。因此應該不使用巨集,使用內聯函式。

在普通函式前面加上inline關鍵字使之成為內聯函式,但是必須注意函式體和宣告結合在一起,否則編譯器將它作為普通函式來對待。

內聯函式的確占用空間,但是內聯函式相對於普通函式的優勢只是省去了函式呼叫時候的壓棧,跳轉,返回的開銷,我們可以理解為內聯函式是以空間換時間。

為了定義內聯函式,通常必須在函式定義前面放乙個inline關鍵字。但是在類內部定義內聯函式時並不是必須的,任何在類內部定義的函式自動成為內聯函式。

在c++內部編譯會有一些限制,以下情況編譯器可能考慮不會將函式進行內聯編譯

內聯僅僅是給編譯器乙個建議,編譯器不一定會接受這種建議,如果你沒有將函式宣告為內聯函式,那麼編譯器也可能將此函式做內聯編譯。乙個好的編譯器將會內聯小的、簡單的函式。

c++在宣告函式原型的時候可為乙個或多個引數指定預設(預設)的引數值,當函式呼叫的時候如果沒有指定這個值,編譯器會自動用預設值代替。

c++在宣告函式時,可以設定佔位引數,佔位引數只有引數型別宣告,而沒有引數名宣告。一般情況下,在函式體內部無法使用佔位引數,佔位引數可以設定預設值

void func(int a, int b, int = 10);

在傳統c語言中,函式名必須是唯一的,程式中不允許出現同名的函式,在c++中允許出現同名函式,這種現象被稱為函式過載,函式過載的目的是為了方便的使用函式名。

實現函式過載的條件

函式返回值不能作為過載條件,因為在呼叫引數型別一樣的函式時,編譯器無法獲取到返回值,所以無法確認呼叫那個函式。

在函式具有預設引數的時候,需要注意二義性問題。就是要考慮到預設值的問題。

編譯器為了實現函式過載,使用不同引數型別來修飾不同的函式名。

extern 「c」的作用就是為了實現c++**能夠呼叫其他c語言**,加上extern 「c」後,這部分**編譯器按c語言的方式進行編譯和鏈結,而不是按c++的方式,這個可以防止c語言在c++編譯時會出現的問題

#ifdef _cplusplus

extern "c"

#endif

C語言總結(一)

不可能通過執行呼叫函式來改變實參指標變數的值,但是可以改變實參指標變數所指變數的值。例如swap函式需要傳指標而不是傳值。c語言中,陣列名代表陣列中首元素的位址。陣列變數本身不能被賦值 要把乙個陣列的所有元素交給另乙個陣列,必須採用遍歷。引用乙個陣列元素,可以用兩種方法 1 下標法,如a形式 2 指...

C語言知識總結(一)

第一章 概述 1 c語言的基本知識 1.1 c語言的執行步驟 編輯 程式 的錄入,生成源程式 c 編譯 語法分析查錯,翻譯生成目標程式 obj 語法或邏輯錯誤,從第乙個開始改,變數定義,語句格式,表示式格式等 鏈結 與其他目標程式或庫鏈結裝配,生成可執行程式 exe 執行1.2 main函式的基本知...

C語言知識總結(一)

使用者模式 應用程式都是執行在使用者區域 核心模式 作業系統的核心,裝置驅動程式,這些都是在核心模式下執行的 大小端與進製關係 乙個位只能表示0,或者1兩種狀態,簡稱bit,乙個位是乙個bit 乙個位元組為8個二進位制,稱為8位,簡稱byte,8個位元是乙個位元組 乙個字為2個位元組,簡稱word。...