C 11新標準總結

2021-07-28 22:31:55 字數 3684 閱讀 1779

c++11新標準出現已久,在此主要對它做乙個總結:
c++11新增型別long long和unsigned long long,以支援64位的整型,char16_t,char32_t,以支援16位和32位的字元表示。
用大括號括起來的列表(初始化列表)的適用範圍,使其可用於所有內建型別和使用者定義的型別。使用列表初始化的時候可以加等號(=),也可以不新增:
int x = ;

double y;

short quar[5];

另外,列表初始化的用法也可用與new表示式中:
int *arr = new

int[3];

在建立物件的時候,使用大括號括起來的列表來初始化建構函式:
class stump

}stump s1(3,1.5);//old style

stump s2;//c++ 11

stump s3 = ;//c++ 11

用初始化列表可以防止縮窄,即禁止數值賦給無法儲存它的數值變數。
char c1 = 1.57e27; //double-to-char, 可以編譯通過

char c2 = 789123456; //int-to-char, 可以編譯通過

//然而如果使用列表初始化語法,編譯器將禁止進行這樣型別轉換

char c1; //double-to-char, compile-time error

char c2; //int-to-char, out-of-range, compile-time error

//但允許轉換為更寬的型別,同時,只要值在較窄型別的取值範圍內,將其轉換為較窄的型別也是允許的:

char c1; //int-to-char, in range, allowed

double c2 = ; //int-to-double, allowed

模板類std::initializer_list,可將其作為建構函式的引數:
#include

double sum(std::initializer_list il)

int main()

);}

c++ 11提供了簡化的宣告功能:

1、auto

以前,關鍵字auto是乙個儲存型別的說明符,c++ 11將其用於實現自動型別推斷,這要求進行顯式初始化,讓編譯器能夠將變數的型別設定為初始值的型別:

auto maton = 112;//maton is type int

auto pt = &maton; //pt is type int *

double fm(double,int);

auto pf = fm;

2、decltype

關鍵字decltype將變數的型別宣告為表示式指定的型別。下面的語句的含義是,讓y的型別與x的型別相同,其中x是乙個表示式:

decltype(x) y;

//samples

double x;

int n;

decltype(x*n) q;

decltype(&x) pd;

//這在定義模板時很有用,因為只有等到模板被例項化時才能確定型別:

template

void ef(t t, u u)

int j=3;

int &k=j;

const

int &n = j;

decltype(n) i1;//i1 type const int &

decltype(j) i2;//i2 type int

decltype((j)) i3;//i3 type int &

decltype(k+1) i4;//i4 type int

3、返回後置型別

c++ 11新增了一種函式宣告的語法:在函式名和引數列表後面(而不是前面)指定返回型別:

double f1(double,int);

auto f2(double,int)->double;

//這種用法比較適合於模板中:

template

auto eff(t t,u u)->decltype(t*u)

{}

4、模板別名:using=

對於冗長或複雜的識別符號,如果能夠被建立其別名將很方便。以前,c++為此提供了typedef:

typedef

std::vector

::iterator ittype;

using ittype = std::vector

::iterator;

//差別在於,using可用於模板部分具體化,但typedef不能

template

using arr12 = std::array

;//上述語句具體化array(int = 12)。

std::array

a1;

std::array

a2;

//可將它們替換為如下宣告:

arr12 a1;

arr12 a2;

5、nullptr

空指標是不會指向有效資料的指標,c++11新增nullptr來表示指標型別。

c++ 中引入智慧型指標auto_ptr,實現自動記憶體釋放,在c++11開始摒棄了這種用法,新增了3種智慧型指標:unique_ptr、shared_ptr、weak_ptr。

std::shared_ptr 是一種智慧型指標,它能夠記錄多少個 shared_ptr 共同指向乙個物件,從而消除顯示的呼叫 delete,當引用計數變為零的時候就會將物件自動刪除,std::unique_ptr 是一種獨佔的智慧型指標,它禁止其他智慧型指標與其共享同乙個物件,從而保證了**的安全,std::weak_ptr防止相互引用導致記憶體無法釋放。

之前,c++提供了異常規範,用來之處哪些函式可能引發哪些異常:
void f501(int) throw(bad_dog);

void f733(long

long ) throw();

//在c++ 11中擯棄了這種用法,增加關鍵字noexcept,用來表示某個函式不會發生異常:

void f875(short,short) noexcept;

之前的列舉型別的作用域為列舉定義所屬的作用域,這意味著如果在同乙個作用域內定義兩個列舉,它們的列舉成員不能同名。c++ 11可以使用class或struct定義列舉:
enum old;

enum class new1;

enum struct new2;

為簡化和擴充套件類設計,c++11做了多項改進,包括建構函式的繼承和彼此的呼叫

~~未完待續~~

C 11 新標準學習記錄1

1.long long 型別,c primer 第五版中 說long long 是c 11 中新定義的人。我在使用xp 32位 vs2005 時,發現也有long long 型別,並且是8位元組的,應該是編譯器提供的一型別.2,列表初始化,對於內建變數,現在可以支援四種初始化方式 int i 0 i...

C 11新標準之五 constexpr

常量表示式必須在編譯期間計算出它的值並且 它的值不可以被改變。在c 11中,我們可以通過宣告constexpr讓編譯器確定乙個變數是不是常量表示式,宣告為constexpr的變數是const型別的變數,它必須由常量表示式來初始化。例如 cpp view plain copy constexpr in...

C 11新標準之三 nullptr

c 11中引入了新的空指標常量nullptr,nullptr可以轉換成任意型別的指標,使用方式如下 cpp view plain copy int p1 nullptr 等同於 int p1 0 在c 11之前,c 程式設計師經常使用null來作為空指標常量,null的定義如下 cpp view p...