C 11的一些功能

2021-09-07 01:17:01 字數 3091 閱讀 1073

1.斷言是將乙個須要為真的表示式放在語句中,在debug

模式下檢查一些邏輯錯誤的引數。c++

中使用assert

須要使用

或者標頭檔案。有函式定義例如以下:

void  fun(int a,int n)

這樣就能夠檢查n<=0

的情況。假設遇到這樣的情況,程式會呼叫abort()

函式而終止。

c++11

提供了static_assert

斷言,它的函式原型接受兩個引數,乙個是斷言表示式。乙個是警告資訊,能夠用字串表示。

static_assert(sizeof(int)==8,」64-bitmachine should follow this」);

int main()

可見。

static_assert()

比assert

提供了很多其它的資訊。另外,

static_assert()

用於在編譯期做斷言推斷,而

assert()

用於在執行期間做斷言推斷。

2.__func__

是c++99

標準中提前定義的識別符號,功能是返回所在函式的名字,c++11

標準中,__func__

能夠用於結構體中。如:

#include #include using  namespace std;

struct test

const char *name;

};int main()

a(int i):x(i)

a(double d ):f(d)

private:

void init();

int x;

double f;

};

上面的**中,三個版本號的建構函式都呼叫了

init()

函式。有沒有辦法簡化這段**呢?

能夠使用委派建構函式:

class  a

a(int i):a()

a(double d):a()

private:

void init();

int x;

double f;

};

4.初始化列表

#include #include using  namespace std;

int main()

;int b;

vectorc;

return 0;

}

c++11

支援這樣幾種初始化的方式:

賦值符號 如int  a=1+2;

賦值符號加上初始化列表 int  a=;

圓括號 int  a(1+2);

花括號加上初始化列表 int  a

5.右尖括號的改進

template

classa

{};vector>v;//c++98

編譯失敗,c++11

編譯成功

vector> v;//c++98

編譯成功,c++11

編譯成功

6.auto

型別推導

#includeusing  namespace std;

int main()

9.空指標nullptr

c++98

中。空指標null

是乙個巨集,類似於#define null0

的形式,所以null

本質上是個整型。c++11

提出了nullptr

取代null

作為空的指標常量。

nullptr

相對於null

有什麼優勢,能夠看下這個函式過載的樣例。

void f(int i){}

void  f(char *c){}

f(null)

將會呼叫f(int)

的版本號。由於null是0

而f(nullptr)

將會呼叫f(char*c),

由於nullptr

是nullptr_t

型別的

nullptr

與nullptr_t

的關係:nullptr_t

是指標型別。nullptr

是nullptr_t

型別的常量

nullptr_t

的性質有:

nullptr_t

型別資料能夠隱式轉換成隨意乙個指標型別

nullptr_t

不能轉換為非指標型別,

nullptr_t

能夠用於關係運算,但不能用於算術運算

#include #include using namespace std;

int main()

;coutint

定義了fun

函式,它是lamda函式

lamda

函式的定義方法例如以下:

[capture](parameter list) mutable ->return type

有關各個欄位的含義這裡不再贅述。

以下是lamda

在stl

中應用的乙個樣例:

#include #include #include using namespace std;

inline void cmp(int i)

{if(i>7)

cout<<"larger than 7"for(auto it=v.begin();it!=v.end();++it)

{ if(*it>7)

cout<<"largerthan 7"<7)

cout<<"largerthan 7"《上面的**遍歷乙個容器

vector

,使用了三種方法,一是利用迭代器。逐個推斷,二是利用仿函式,三是利用了

lamda

函式。

C 11 比較詭異的一些語法

void f int i auto main int 這裡 後面可以使用decltype e 表示式 range for for auto v l default delete 之前是不寫或private 限定 override final using base base 引入基類的建構函式,實際上...

一些常用的C 11新增特性

c 11新標基於c 程式設計社群的大量實踐經驗,並吸收了很多boost庫的特性,還對原有c 做了一些改進工作,是學習現代c 程式設計c 11支援對於所有的內建型別和使用者定義型別使用大括號方式的初始化列表,使用初始化列表時,可以新增等號,也可以沒有。int x 以前只有陣列可以這樣初始化 doubl...

C 11中的一些新特性

c 11擴大了初始化列表的使用範圍,所有的內建型別和使用者自定義型別都可以使用列表初始化,號可新增可不新增。如 int main int arr2 int arr3 newint 5 vector int v1 vector int v2 return0 容器支援花括號列表初始化,本質上是增加了乙個...