C++ 語法筆記

最近需要用C++做一些跨平臺的組件普舆,我自己本身對C++的語法不是特別熟練,也算是邊寫邊學(xué)表悬。
記錄了一些平時開發(fā)過程中用到的語法筆記弥锄。

1.C++支持函數(shù)重載,C不支持。底層用了namemangling技術(shù)籽暇,通過編譯器把函數(shù)名字改掉窘行,每個方法名不一樣。不同編譯器有不同的生成規(guī)則图仓。

2.extern "C":

  • 被extern "C" 修飾的代碼會按照C語言的方式去編譯。

    extern "C" {
          void fun(){
          count << "func()" << endl;
        }
    }
    
  • 如果函數(shù)同時有聲明和實現(xiàn)但绕,要讓函數(shù)聲明被extern "C" 修飾救崔,函數(shù)的實現(xiàn)可以不修飾。

  • 假如有兩個函數(shù)是通過.c(C語言)的方式進(jìn)行實現(xiàn)的捏顺,那么在cpp的文件中六孵,假如想使用這兩個函數(shù)的話,不僅要聲明幅骄,并且需要的在聲明外要用 extern "C" 修飾劫窒。告訴編譯器,這兩個方法是用C語言來實現(xiàn)的拆座。

  • 當(dāng)然也可以這么寫

    extern "C" {
          #include "math.h"http://include的作用:把math.h的內(nèi)容原封不動的拷貝一份主巍。
    }
    
  • 那么一個函數(shù)聲明既要給C調(diào)用又要給C++調(diào)用怎么辦呢?用__cplusplus宏來判斷你是否在C++的環(huán)境

    #ifdef __cplusplus
    extern "C" {
    #endif
      
      //這里是是你的聲明或者代碼,xxx
      
    #ifdef __cplusplus 
    }
    #endif
    

3.防止重復(fù)include:

  • 基于include只是執(zhí)行了copy操作挪凑,所以include多次在語法上都沒啥問題孕索,但是代碼量會增多,因此為了防止多次include

    可以用以下代碼:首次未定義才進(jìn)入聲明邏輯躏碳。

#ifndef ABC
#define ABC

xxx
  • 或者可以用編譯器的特性#pragma once來指名頭文件只包含一次搞旭。

兩者區(qū)別:第一種不受編譯器的任何限制,是標(biāo)準(zhǔn)語法菇绵。第二種老編譯器不支持肄渗,兼容性不夠,只針對整個文件咬最。

4.inline內(nèi)聯(lián)函數(shù):本質(zhì)把方法替換成具體實現(xiàn)翎嫡,可以減少函數(shù)調(diào)用的開銷,會增大代碼體積會永乌。但inline只是僅僅是建議編譯器進(jìn)行替換钝的,有時候聲明了也不一定起作用,比如:遞歸铆遭。遞歸是無法內(nèi)聯(lián)的硝桩。

內(nèi)斂函數(shù)和宏都可以減少函數(shù)的開銷,對比宏枚荣,內(nèi)斂函數(shù)有函數(shù)的特性碗脊,有代碼提示。

5.const:被修飾的變量不可修改

如果修飾的是類或者結(jié)構(gòu)體,那么其中的成員也不可更改衙伶。

const修飾右邊的東西

int age = 10;
int height = 20;

int *p = &age; //int * 是一個int指針 p是具體的值
*p = 20; //修改p指向的具體值
p = &height;  //修改p的值

const int *p1 = &age;// p1是常量祈坠,*p1是常量,所以不能改年齡
int const *p2 = &age;// 和p1沒區(qū)別
int * const p3 = &age;//p3是常量矢劲,*p3不是赦拘,因此可以年齡。
const int * const p4 = &age;//兩個都不能改
int const * const p5 = &age;//兩個都不能改
 

6.引用

在C++ 中芬沉,引用可以起到跟指針類似的功能躺同,但指針可以修改,引用必須初始化丸逸,一旦指向了某個變量蹋艺,就不可以再改變。

int age = 10
int &refAge = age;
age = 20;

價值:比指針更安全黄刚。因為指針在中途可以修改指向捎谨,引用不能。

本質(zhì):引用是弱化了的指針憔维。本質(zhì)是指針

7.this

通常一個對象的成員變量是在對象當(dāng)中的涛救,而函數(shù)是放在代碼段的,為了在函數(shù)體內(nèi)用this能訪問到對象本身业扒,這里有個一個隱式參數(shù)州叠,把對象地址傳入函數(shù)體中,然后將對象地址給this進(jìn)行賦值

8.堆的申請和釋放

new和delete或者new[]和delete[]必須成對出現(xiàn)

char *p = new char[4]; //申請連續(xù)的4個字節(jié)凶赁、*p指向第一個咧栗。char類型的數(shù)組
*p = "11";//給第一個字節(jié)賦值
*(p + 1) = "12"http://給第二個字節(jié)賦值
delete[] p;

memset(p,1,4);//p的4個字節(jié)每一個字節(jié)都是1

9.析構(gòu)函數(shù)

對象銷毀時,進(jìn)行調(diào)用虱肄,通過malloc分配的對象free時不會調(diào)用析構(gòu)函數(shù)致板,聲明為pulic才能被外界正常使用。

構(gòu)造方法的順序和析構(gòu)的順序相反咏窿。

構(gòu)造函數(shù): 父類構(gòu)造->子類構(gòu)造

析構(gòu)函數(shù): 子類析構(gòu)->父類析構(gòu)

10.多態(tài)

定義:同一操作作用于不同的對象斟或,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果集嵌。

方法的調(diào)用萝挤,默認(rèn)看指針類型進(jìn)行操作,不看實際的對象類型是什么根欧。

很多語言默認(rèn)支持多態(tài)怜珍,C++要實現(xiàn)多態(tài),需要用到虛函數(shù)凤粗。

11.虛函數(shù)

定義:被virtual修飾的成員函數(shù)

只要在父類中聲明為虛函數(shù)酥泛,子類中重寫的函數(shù)也自動變成虛函數(shù)(子類可以省略virtual關(guān)鍵字)

1.有虛函數(shù)存在一個類頂部會多4個字節(jié),這個4個字節(jié)存放的是虛表(虛函數(shù)表)的地址,虛表里面有每個虛函數(shù)的方法地址柔袁。

2.所有對象共用一張?zhí)摫泶舳恪#ㄈ绻嵌嗬^承就多張?zhí)摫恚?/p>

3.因此如果父類指針指向子類對象,析構(gòu)函數(shù)也應(yīng)該定義為虛函數(shù)捶索。否則釋放時無法調(diào)用子類的虛函數(shù)插掂。

12.模版

模版的本質(zhì)類似范型,編譯器會為多類型的入?yún)⑸啥鄠€類型的函數(shù)腥例。

13.類型轉(zhuǎn)換

static_cast:普通轉(zhuǎn)換辅甥,不支持交叉轉(zhuǎn)換。

dynamic_cast:支持交叉轉(zhuǎn)換院崇,會做安全計算。

reinterpret_cast:簡簡單單的二進(jìn)制復(fù)制袍祖。

const_cast:把const轉(zhuǎn)換成非const底瓣。

14.nullptr可以解決NULL的二義性(既代表0又代表空指針)

15.智能指針

傳統(tǒng)指針存在的問題:

1.需要手動管理內(nèi)存。

2.容易發(fā)生內(nèi)存泄漏蕉陋。

3.釋放之后產(chǎn)生野指針捐凭。

智能指針可以解決這些問題。

實現(xiàn)原理類似于裝箱和拆箱凳鬓,用一個內(nèi)部私有指針保存對象茁肠。在釋放時,自動釋放私有的內(nèi)部指針缩举。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垦梆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仅孩,更是在濱河造成了極大的恐慌托猩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽慕,死亡現(xiàn)場離奇詭異京腥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)溅蛉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門公浪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人船侧,你說我怎么就攤上這事欠气。” “怎么了镜撩?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵晃琳,是天一觀的道長。 經(jīng)常有香客問我,道長卫旱,這世上最難降的妖魔是什么人灼? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮顾翼,結(jié)果婚禮上投放,老公的妹妹穿的比我還像新娘。我一直安慰自己适贸,他們只是感情好灸芳,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拜姿,像睡著了一般烙样。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蕊肥,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天谒获,我揣著相機(jī)與錄音,去河邊找鬼壁却。 笑死批狱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的展东。 我是一名探鬼主播赔硫,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盐肃!你這毒婦竟也來了爪膊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤砸王,失蹤者是張志新(化名)和其女友劉穎惊完,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體处硬,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡小槐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荷辕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凿跳。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疮方,靈堂內(nèi)的尸體忽然破棺而出控嗜,到底是詐尸還是另有隱情,我是刑警寧澤骡显,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布疆栏,位于F島的核電站曾掂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壁顶。R本人自食惡果不足惜珠洗,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望若专。 院中可真熱鬧许蓖,春花似錦、人聲如沸调衰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚎莉。三九已至米酬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趋箩,已是汗流浹背赃额。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留阁簸,地道東北人爬早。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓哼丈,卻偏偏與公主長得像启妹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子醉旦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容