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...