C 基礎知識彙總 入門

2021-10-06 11:03:38 字數 4776 閱讀 9374

(六)內聯函式

(七)auto關鍵字(c++11)

(八)基於範圍的for迴圈(c++11)

(九)指標空值nullptr(c++11)

使用cout標準輸出(控制台)和cin標準輸入(鍵盤)時,必須包含< iostream >標頭檔案以及std標準命名空間。

使用c++輸入輸出更方便,不需增加資料格式控制,比如:整形–%d,字元–%c。

#include

//輸入輸出流

using

namespace std;

//命名空間

intmain()

1、定義:

namespace   名稱

2、用法:

比如定義了兩個同名的函式,在主函式裡面如何引用呢?

void

fun(

)void

fun(

)int

main()

我們發現,這時候根本不能通過編譯,那該怎麼辦呢?這個時候,就可以用到我們的命名空間,解決方案如下:

namespace a};

namespace b};

using

namespace a;

//想用哪個就呼叫哪個

intmain()

定義:預設引數是宣告或定義函式時為函式的引數指定乙個預設值。在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。
1、全預設引數

void

testfunc

(int a =10,

int b =20,

int c =30)

2、半預設引數

void testfunc(int a, int b = 10, int c = 20)

注意:半預設引數必須從右往左依次來給出,不能間隔著給預設引數不能在函式宣告和定義中同時出現。一般寫到宣告的時候。

定義:是函式的一種特殊情況,c++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表(引數個數 或 型別 或 順序)必須不同,常用來處理實現功能類似資料型別不同的問題。

int

add(

int left,

int right)

double

add(

double left,

double right)

long

add(

long left,

long right)

intmain()

這種現象在c語言中是不支援的,即c語言不支援同名函式,但是c++是支援的,即函式的過載,但是呼叫的時候,該呼叫哪個呢?這就涉及到另乙個概念——名字修飾。

在編譯的時候,每個編譯器會根據自己的函式名修飾規則來對函式重新命名。比如:

int

max(

int a,

int b)

//編譯器重新命名為:?max@@yahhh@z

char

max(

char a,

char b)

//編譯器重新命名為:?max@@yaddd@z

引用不是新定義乙個變數,而是給已存在變數取了乙個別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體空間。

int

main()

注意:

引用在定義時必須初始化

乙個變數可以有多個引用

引用一旦引用乙個實體,再不能引用其他實體

定義乙個函式將兩個變數的值交換
在c語言中的實現方法是 將函式形參定義成指標型別(形參為臨時變數,不能改變實參,呼叫函式後被摧毀。)

//c語言實現方法

void

exchange

(int

*a,int

* b)

intmain()

當用用用解決時,形參可以直接定義為引用變數,不單獨分配空間,時間、空間效率高。

//引用變數實現方法

void

exchange

(int

&a,int

&b)int

main()

(1)const
const修飾的量為乙個常量即不能被修改的量。
如:int a=10;指定義了乙個變數a並初始化為10,但是後面可以對a的值進行修改。

但是 const int a = 10;指的是定義了乙個常量10,後面並不能被修改。

(2)const和指標結合時的用法

(3)對指標、陣列、結構體的引用

struct student

;int

main()

;//指標的引用

int*p =

&a;int

*&q = p;

//陣列的引用

int(

&brr)[10

]= arr;

//&brr要加括號,因為&優先順序沒有高。

//結構體引用

student s;

student &rs = s;

}

(4)引用和指標的區別

引用在定義時必須初始化,指標沒有要求

引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別

實體沒有null引用,但有null指標

引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小

有多級指標,但是沒有多級引用

訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理

引用比指標使用起來相對更安全

以inline修飾的函式叫做內聯函式,編譯時c++編譯器會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷,內聯函式提公升程式執行的效率。
//內聯函式

inline

void

exchange

(int

*a,int

* b)

intmain()

inline是一種以空間換時間的做法,省去呼叫函式額開銷。所以**很長或者有迴圈/遞迴的函式不適宜使用作為內聯函式。

inline對於編譯器而言只是乙個建議,編譯器會自動優化,如果定義為inline的函式體內有迴圈/遞迴等等,編譯器優化時會忽略掉內聯。

可以自動推到變數型別
int a =10;

auto b = a;

//此時b也為int型、

用auto宣告指標型別時,用auto和auto*沒有任何區別,但用auto宣告引用型別時則必須加&。

auto p =

&a;//等價於 auto *p = &a;

auto

&b = a;

//引用

當在同一行宣告多個變數時,這些變數必須是相同的型別,否則編譯器將會報錯,因為編譯器實際只對第乙個型別進行推導,然後用推導出來的型別定義其他變數。

auto a =

1, b =2;

auto c =

3, d =

4.0;

// 該行**會編譯失敗,因為c和d的初始化表示式型別不同

注意:

auto不能作為函式的引數

auto不能直接用來宣告陣列

為了避免與c++98中的auto發生混淆,c++11只保留了auto作為型別指示符的用法

auto在實際中最常見的優勢用法就是跟以後會講到的c++11提供的新式for迴圈,還有lambda表示式等

進行配合使用。

對於乙個有範圍的集合而言,由程式設計師來說明迴圈的範圍是多餘的,有時候還會容易犯錯誤。因此c++11中

引入了基於範圍的for迴圈。for迴圈後的括號由冒號「 :」分為兩部分:第一部分是範圍內用於迭代的變數,第二部分則表示被迭代的範圍。

列印陣列內容:

int s=

;for

(const

auto

&b:s)

cout << endl;

使用條件:

for迴圈迭代的範圍必須是確定的

對於陣列而言,就是陣列中第乙個元素和最後乙個元素的範圍;對於類而言,應該提供begin和end的

方法,begin和end就是for迴圈迭代的範圍。

迭代的物件要實現++和==的操作

在傳統的c標頭檔案(stddef.h)中null實際是乙個巨集,null可能被定義為字面常量0,或者被定義為無型別指標(void*)的常量。不論採取何種定義,在使用空值的指標時,都不可避免的會遇到一些麻煩。 所以為了提高**的健壯性,在後續表示指標空值時建議最好使用nullptr。

另外注意:

在使用nullptr表示指標空值時,不需要包含標頭檔案,因為nullptr是c++11作為新關鍵字引入的。

C 入門基礎知識

1.c 基本資料型別 整型int 字元型 char 浮點型 float double 邏輯性 bool 無型別 void 也稱內建型別 語言內部 已定義好的型別 非基本資料型別 陣列 type 指標 type 結構體 struct 聯合體 union 列舉 enum 類 class 這些即就是自定義...

c 入門基礎知識

名字空間 namespace,即名字空間,是指 識別符號的各種可見範圍。c 標準程式庫 中的所有識別符號都被定義於乙個名為std的namespace中。使用 using namespace 可以使得後面不需要每次指定名字空間。1 名字 空間除了 系統定義 的名字空間之外,還可以自定義,定義 名字空間...

C 入門基礎知識

一 命名空間 命名空間 實際上就是乙個由程式設計者命名的記憶體區域,程式設計者可以根據需要指定一些有名字的空間域,把一些全域性實體分別放在各個命名空間中,從而與其他全域性實體分隔開來。它相當於乙個更加靈活的檔案域 全域性域 可以用花括號把檔案的一部分括起來,並以關鍵字namespace開頭給它起乙個...