1.斷言是將乙個須要為真的表示式放在語句中,在debug
模式下檢查一些邏輯錯誤的引數。c++
中使用assert
須要使用
或者標頭檔案。有函式定義例如以下:
這樣就能夠檢查n<=0void fun(int a,int n)
的情況。假設遇到這樣的情況,程式會呼叫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.初始化列表
c++11#include #include using namespace std;
int main()
;int b;
vectorc;
return 0;
}
支援這樣幾種初始化的方式:
賦值符號 如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 容器支援花括號列表初始化,本質上是增加了乙個...