More extensions to C , Some features of C++11
對於稍微有些C++的同學,大概都知道C++和C的一些主要區別,大的區別就是一個是面向對象,一個是面向過程,這就涉及到對象; 同時,還有命名空間的引入,防止變量名沖突; 還有struct支持成員函數等。 我就繼續注釋一些更需要注意的一些不同,一些是C++11中的東西。
引用
可以通過引用修改它引的對象,但是不能改變它本身。這麼聽來,就像是常量指針, 另外,引用也讓代碼更加自然,不像c裡邊會出現一堆的&來表示傳址調用。
int a;
int ra;
int const rr a;
使用引用時,有幾點需要記住:
函數中是否使用引用的場合
是內建類型(int double char等),且我們實參值,直接
它,那就通過
類型是,結構體等,我們它的成員變量,采用
調用
等,需,采用調用
右值引用 (對C++11不是很熟悉,會有一些理解上的錯誤,請指正)
int intVa()
{
return ;
}
int a intVal();
int const a intVal();
int a intVal();
void receive(int value){value; cout “Lvalue parameter\n”;} // 左值引用版本
void receive(int
value){value; cout ;} // 右值引用版本
void
receive(int const value)
value; cout ;}
int main()
{
receive();
int v ;
int const cri
v;
receive(cri);
receive(v);
receive(intVal());
}
,在傳入時。
move semantics 和 完美轉發 perfect
forwarding 的基礎。移動語義我暫時還不懂啥,以後再講述。
強類型-枚舉類
enum class CharEnum unsigned char
{
NOT_OK,
OK
};
enum Enum1; : no size
available
enum Enum2 unsigned int;
enum class
Enum3;
enum class Enum4 char;
初始化列表
c語言中,可以用大括號包含一個初始化列表來初始化數組、結構體。C++11把這個概念繼續擴展了,引入了
initializer_list<Type>
這個模本類,可以擴展初始化類,同時也能對初始化列表進行個性化操作。 使用前,要包含頭文件 <initializer_list>
。同時,可以將初始化列表當做函數形參傳入。
void values(initializer_listint iniValues)
{
cout iniValues.size() ;
for
(
initializer_listintconst_iterator begin
iniValues.begin();
begin
iniValues.end();
begin
)
cout begin ;
}
auto 和 decltype 這個我覺得,最好了
類型定義和 ‘using’ 聲明
比如 unsigned long int compute(double, double),
這個函數指針的聲明,使用typedef可以變成這樣:
typedef unsigned long int(*pfun)(double, double);
但是,我們聲明時 pfun f;
時,掩蓋了Pfun實際上是一個指針的事實,必須看typedef定義才知道。關於這點,我很诟病,導致我函數指針一直沒學好。C++11中將這點進行了升華,采用using
關鍵字:
using pfun
unsigned long int(double, double);
或者和auto配合:
using
pfun auto (double,double)
unsigned long
int;
for循環的范圍操作
傳統C/C++ 的for采用標准的
for(init;cong;next)語句,這對遍歷的使用,不那麼的便捷,很多語言都提供了范圍操作符,在STL的算法庫也包含了for_each方法,但是還是不夠便捷。C++11中引入了for的范圍操作版本:
int array[100];
for (auto &element:array){...}
這裡,推薦使用auto,避免思想負擔在解析類型上。 同時,element是變量名,表示array中每次遍歷的元素。
引用操作符非常重要,若是要修改元素或array是類類型,則用引用; 若是類類型,但不改變,用const&;
普通的內建類型且不改變,可以不用&。
有了這個范圍操作,C++算是一大進步呀。
原始字符串
傳統C/C++使用""包含字符串,用\來做逃脫而字符。這樣,我們會在代碼中看到一堆的\\\\\\
實在很影響閱讀。現在很多語言都支持正則表達式了,而正則中最多也正是\\這樣的符號,讓C++來使用,my god!
。我覺得C++可能借鑒了python的R字符串,和perl的定界符規則,引出自己的原始字符串,在原始字符串中,不存在逃脫語義。寫法如下:
R"(string)" 寫法一
R"delimiter(string)delimiter" 寫法二
更細致的闡述,打算放在正則表達式時討論。
新增類型說明符
0101:
表示二進制的5
F : 說明是一個浮點型常量 3F
L : 前綴使用說明字符串中字符是wchar_t, 後綴使用說明是一個 long
p :十六進制數*(2^p), 即左移p。
增加對 Unicode 的支持
字符串:
char utf_8[] u8;
char16_t utf16[] u;
char32_t utf32[] U;
對unicode常量,使用\u逃脫,加上一個十六進制量
char utf_8[] u8;
char16_t utf16[] u;
char32_t
utf32[] U;
同樣,表達式可以使用原始字符串
感慨:C++復雜太多了,多了太多東西了,每個知識點都是一大章的東西,看來,路漫漫呀!