這是c++11新特性介紹,雖然現在來說有些不合時宜,但是也有一些有趣的地方。覺得麻煩的可以直接跳到最後哦!
long long型別
c++11標準中新加入了long long型別屬性,占用空間不小於long型別。測試**如下:
long large = long_max;另外,下面的constexpr指標與const指標的含義是完全不同的:long long long_large = llong_max;
long long long_long_large = 1ll << 63;
cout<<"test long long:"《在我的機器上實測,long long型別和long型別同樣使用64bit空間。
nullptr字面量
c++11標準中專門為空指標增加了nullptr字面量,同時不推薦再使用null或者0表示空指標。
int *p1 = nullptr;
int *p2 = 0;
int *p3 = null;
cout<<"test nullptr: "<<(p1 == p2)<<'\t'<<(p1 == p3)《最終測試結果,nullptr和null和0是一樣的。
constexpr
c++11標準中新增constexpr用於宣告常量表示式,編譯器會驗證此變數的值是否是乙個常量表示式。
int out_i = 0; // out_i定義於函式外部
constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int *p4 = &out_i;
// the following would cause a make error
// since large is not a constexpr
//constexpr int wrong = large + 1;
// since &in_j is not a constexpr;
//int in_j = 0;
//constexpr int *p5 = &in_j;
constexpr int *p6 = nullptr; // a const pointer point to an int第乙個指標表示乙個常量指標,即指標的值是常量;而第二個指標表示乙個指向const int的指標,即指標指向的值是常量。// p6 = &out_i; // error: p6 is a constexpr
const int *p7 = nullptr; // a pointer point to a const int
constexpr還可以用於函式,constexpr函式是指能用於常量表示式的函式,它遵循以下幾條約定:
a.返回型別是字面值型別
b.形參型別是字面值型別
c.函式體中必須有且僅有一條return語句
constexpr int sz()noexcept還可以帶引數,noexcept(true)表示不會丟擲異常,noexcept(false)表示可能丟擲異常。constexpr int new_sz(int cnt)
constexpr int size = sz();
constexpr int nsize = new_sz(mf);
//constexpr int wrong_size = new_sz(out_i); // error: out_i is not a constexpr
cout<<"test constexpr: "noexcept可以用作異常指示符,用於指示乙個函式是否會丟擲異常。編譯器並不檢查使用了noexcept的函式是否真的不丟擲異常,在執行時,如果乙個使用noexcept承諾不丟擲異常的函式實際丟擲了異常,那麼程式會直接終止。
void no_except() noexcept
throw 1;
// the following call will cause terminate
//no_except();
同時noexcept還可以用作運算子,接受乙個函式呼叫,返回乙個bool值表示是否會丟擲異常。noexcept運算子並不會對其實參進行求值。
將noexcept運算子,結合帶引數的noexcept指示符,可以得到如下常用法:
void no_except2() noexcept(noexcept(no_except())){}(1)long long型別。cout<<"test noexcept: "《這種用法表示no_except2和no_except的異常說明保持一致。
列表初始化
c++11新標準中為很多態別增加了列表初始化的功能。
可以用列表初始化乙個簡單變數。
int single_int1 = 0;
int single_int2 = ;
cout<<"test list initialization:\n"《可以用列表初始化乙個容器(vector,list,map,set…)。
// vector/list list initialization
vectorv1 = ;
listl2;
//vectorv3("mn", "op", "qr"); // wrong initialization format
cout<<"test vector/list list initialization:\n"mapm1 =,,
m1.insert();
sets1 = ;
cout<<"test map/set list initialization:\n"《可以在使用new動態分配記憶體時使用列表初始化。
vector*pv = new vector;
int *pi = new int[5];
cout<<"test new alloator using list initialization:\n"<<(*pv)[2]<<'\t'《可以在傳入引數/函式返回值時使用列表初始化。
m1.insert();
vectorerror_msg(int typ)
switch(typ)
case 1:
return ;
case 2:
return ;
default:
return {};
pairget_pair(int typ)
if(typ == 1) return ;
return pair("default key", "default value");
vectorerr_msg1 = error_msg(1);
vectorerr_msg2 = error_msg(2);
vectorerr_msg3 = error_msg(3);
cout<<"test return value list initialization:\n"pairp2 = get_pair(2);
cout<<"test return pair list initialization:\n"《類內成員初始化
c++11標準中允許直接對類內成員進行初始化/列表初始化。
class initclass
public:
void print_class()
coutint field1 = 1;
int field2;
double field3 = 1.0;
double field4;
class initclassmgr
public:
vectorinit_objs = ;
initclass test_class;
cout<<"test class member initialization:\n";
test_class.print_class();
initclassmgr mgr;
cout<<"test class member of class type initialization:\n";
mgr.init_objs[0].print_class();
(2)nullptr字面量用於表示空指標。
(3)constexpr用於表示常量表示式。
(4) noexcept可以用於指示乙個函式是否會丟擲異常,同時可以用作運算子判定乙個函式是否承諾不丟擲異常。
(5)新增基礎型別、容器型別、new分配記憶體時的列表初始化。構建臨時變數時也可以直接使用列表初始化。
(6)可以直接對類內成員進行初始化/列表初始化。
C 11新特性(8) 類內初始化
重複的初始化 考察下面的 enum linestyle class rect top,right,bottom style rect int l,int t,int r,int b left,top,right,bottom style rect int l,int t,int r,int b,li...
C 11新特性之POD型別
pod plain old data 是c 中非常重要的乙個概念,用來描述乙個型別的屬性其中plain表示這個型別是個平凡的型別,old表示其與c的相容性。c 11中將pod劃分為兩個基本概念 平凡的 trival 和標準布局 standardlayout 什麼是平凡性呢?通常乙個平凡的類或者結構體...
C 11新特性(37) 關聯容器的列表初始化
什麼是關聯容器 關聯容器 associative container 並不是c 11才有的概念,之所以叫關聯容器是因為容器中的元素是通過關鍵字來儲存和訪問的,與之相對的是順序容器 sequence container 其中的元素是通過它們在容器的位置來儲存和訪問的。順序容器的例子 vector na...