C++基礎

基礎知識

  • C++的源文件擴展名是:cpp(c plus plus)
  • C++程序的入口是main函數(shù)(函數(shù)既方法扁达,一個意思)
  • C++完全兼容C語言的語法待诅,很久之前统求,C++叫做C with classes

發(fā)展歷史

截屏2021-02-09 下午1.57.33.png

cin乘碑、cout

  • C++中常使用cin挖息、cout進行控制臺的輸入和輸出
  • cin用的是右移運算符 >> ,count用的是左移運算符 <<
  • endl 是換行運算符
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
    int age;
    cin >> age;
    cout << "age is " << age << endl;
    return 0;
}

函數(shù)重載(Overload)

  • 規(guī)則
    • 函數(shù)名相同
    • 參數(shù)個數(shù)兽肤、參數(shù)順序套腹、參數(shù)類型不同
  • 注意
    • 返回值類型函數(shù)重載無關
    • 調(diào)用函數(shù)時,實參的隱式類型類型轉換可能會產(chǎn)生二義性
  • 本質
    • 采用了name mangling或者叫name decoration技術
      • C++編譯器默認會對符號名(變量名资铡、函數(shù)名等)進行改編电禀、修飾,有些地方翻譯為“命名傾軋”
      • 重載時會產(chǎn)生多個不同的函數(shù)名笤休,不同編譯器(MSVC尖飞、g++)有不同的生成規(guī)則
      • 用過IDA打開【VS_Release_禁止優(yōu)化】可以看到
#include <iostream>
using namespace std;


// display_v
void display() {
    cout << "display() " << endl;
}

// display_i
void display(int a) {
    cout << "display(int a) " << a << endl;
}

// display_l
void display(long a) {
    cout << "display(long a) " << a << endl;
}

// display_d
void display(double a) {
    cout << "display(double a) " << a << endl;
}

int main(int argc, const char * argv[]) {
    display();
    display(10);
    display(10l);
    display(10.1);
    return 0;
}

extern "C"

  • 被extern "C" 修飾的代碼會按照C語言的方式去編譯
extern "C" void func() {
    cout << "func" << endl;
}


extern "C" void func2(int age) {
    cout << "func(int age)" << age << endl;
}


extern "C" {
    void func3(){
        cout << "func()" << endl;
    }

    void func4(int age) {
        cout << "func(int age)" << age << endl;
    }
}
  • 如果函數(shù)同時有聲明和實現(xiàn),要讓函數(shù)聲明extern “C” 修飾,函數(shù)實現(xiàn)不可以修飾
extern "C" void func();
extern "C" void func2(int a);

extern "C" {
    void func3();
    void func4(int a);
}

void func() {
    cout << "func()" << endl;
}

void func2(int a) {
    cout << "func(int a) " << a << endl;
}
  • 由于C政基、C++編譯器規(guī)則的不同贞铣,在C、C++混合開發(fā)時候沮明,可能會出現(xiàn)以下操作
    • C++在調(diào)用C語言API的時候辕坝,需要使用extern "C" 修飾C語言的函數(shù)聲明
  • 有時候也會在編寫C語言代碼中直接使用extern "C",這樣可以直接被C++調(diào)用
  • 通過使用宏__cplusplus來區(qū)分C荐健、C++環(huán)境
// sum.h

#ifndef __SUM_H
#define __SUM_H

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

int sum(int a, int b);
int minus(int a, int b);

#ifdef __cplusplus
}
#endif // __cplusplus

#endif // !__SUM_H
// sum.c

#include "sum.h"

// _sum
int sum(int a, int b) {
    return a + b;
}

int minus(int a, int b) {
    return a - b;
}
// main.cpp
#include <iostream>
#include "sum.h"
using namespace std;
int main(int argc, const char * argv[]) {
    cout << sum(10, 20) << endl;
    return 0;
}

默認參數(shù)

  • C++ 允許函數(shù)設置默認參數(shù)酱畅,在調(diào)用時可以根據(jù)情況省略實參,規(guī)則如下:
    • 默認參數(shù)只能按照右到左的順序
    • 如果函數(shù)同時有聲明江场、實現(xiàn)圣贸,默認參數(shù)只能放在函數(shù)聲明中
    • 默認參數(shù)的值可以是常量、全局符號(全局變量扛稽、函數(shù)名)
#include <iostream>
using namespace std;

int age = 33;

void test() {
    cout <<  "test()" << endl;
}

void display(int a = 11, int b = 22, int c = age, void (*func)() = test) {
    cout << "a is " << a << endl;
    cout << "b is " << b << endl;
    cout << "c is " << c << endl;
    func();
}

int main(int argc, const char * argv[]) {
    display();
    return 0;
}
  • 函數(shù)重載吁峻、默認參數(shù)可能會產(chǎn)生沖突、二義性(建議優(yōu)先選擇默認參數(shù))
#include <iostream>
using namespace std;

void display(int a, int b = 20) {
    cout << "a is" << a << endl;
}

void display(int a) {
    cout << "a is" << a << endl;
}

int main(int argc, const char * argv[]) {
    // Call to 'display' is ambiguous
    display(10);
    return 0;
}

內(nèi)聯(lián)函數(shù)

  • 使用inline修飾函數(shù)的聲明或者實現(xiàn)在张,可以使其變成內(nèi)聯(lián)函數(shù)
    • 建議聲明和實現(xiàn)都增加inline修飾
  • 特點
    • 編譯器會將函數(shù)調(diào)用直接展開為函數(shù)體代碼
    • 可以減少函數(shù)調(diào)用的開銷
    • 會增大代碼體積
  • 注意
    • 盡量不要內(nèi)聯(lián)超過10行代碼的函數(shù)
    • 有些函數(shù)即使聲明為inline用含,也不一定會被編譯器內(nèi)聯(lián),比如遞歸函數(shù)帮匾。
#include <iostream>
using namespace std;

inline int sum(int a, int b);

int main() {
    sum(10, 20);

    getchar();
    return 0;
}

inline int sum(int a, int b) {
    return a + b;
}

內(nèi)聯(lián)函數(shù)與宏

  • 內(nèi)聯(lián)函數(shù)與宏啄骇,都可以減少函數(shù)調(diào)用的開銷
  • 對比宏,內(nèi)聯(lián)函數(shù)多了語法檢測和函數(shù)特性

#pragma once

  • 我們經(jīng)常使用#ifndef瘟斜、#define缸夹、#endif來防止頭文件內(nèi)容被重復包含
  • #pragma once可以防止整個文件的內(nèi)容被重復包含
  • 區(qū)別
    • #ifndef#define螺句、#endif 受C\C++標準的支持虽惭,不受編譯器的任何限制
    • 有些編譯器不支持#pragma once(較老編譯器不支持,如GCC 3.4版本之前的)蛇尚,兼容性不夠好
    • #ifndef芽唇、#define#endif 可以針對一個文件中的部分代碼取劫,而#pragma once只能針對整個文件
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匆笤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谱邪,更是在濱河造成了極大的恐慌炮捧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惦银,死亡現(xiàn)場離奇詭異咆课,居然都是意外死亡灌砖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門傀蚌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來基显,“玉大人,你說我怎么就攤上這事善炫×糜模” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵箩艺,是天一觀的道長窜醉。 經(jīng)常有香客問我,道長艺谆,這世上最難降的妖魔是什么榨惰? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮静汤,結果婚禮上琅催,老公的妹妹穿的比我還像新娘。我一直安慰自己虫给,他們只是感情好藤抡,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抹估,像睡著了一般缠黍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上药蜻,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天瓷式,我揣著相機與錄音,去河邊找鬼语泽。 笑死贸典,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的湿弦。 我是一名探鬼主播瓤漏,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼腾夯,長吁一口氣:“原來是場噩夢啊……” “哼颊埃!你這毒婦竟也來了?” 一聲冷哼從身側響起蝶俱,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤班利,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榨呆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罗标,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闯割。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彻消。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宙拉,靈堂內(nèi)的尸體忽然破棺而出宾尚,到底是詐尸還是另有隱情,我是刑警寧澤谢澈,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布煌贴,位于F島的核電站,受9級特大地震影響锥忿,放射性物質發(fā)生泄漏牛郑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一敬鬓、第九天 我趴在偏房一處隱蔽的房頂上張望淹朋。 院中可真熱鬧,春花似錦钉答、人聲如沸瑞你。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽者甲。三九已至,卻和暖如春砌创,著一層夾襖步出監(jiān)牢的瞬間虏缸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工嫩实, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刽辙,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓甲献,卻偏偏與公主長得像宰缤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晃洒,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

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