C++11的新特徵

C++11對從前的語言做了很大的擴展,在我的感覺來看,加入了很多類似於python的語法,在以前嚴謹完整的基礎上增加了便捷性,更加人性化了,這裏摘取一部分書上提到的新特徵,做一個讀書筆記。
1. 使用auto自動聲明變量或者對象
比如說:

auto i = 42; // i has type int
double f();
auto d = f(); // d has type double

這個功能實在是太便捷了,特別是在聲明一些類型特別複雜的變量的時候,就顯得更加可愛了,比如說:

vector<string> v;
...
auto pos = v.begin();  // pos has type vector<string>::iterator
auto l = [] (int x) -> bool {  // l has the type of lambda
        ...,                   // taking an int and                 
    };                         // returning a bool

但是要記住的是,它是根據初值自動判斷變量類型的,所以必須在使用auto的時候對變量進行初始化。
2. 統一的初始化形式和Initializer_list<>
初始化有各種各樣的形式,諸如各種括號、等號、空格等等,有時候就會弄不清楚對於什麼變量需要使用哪種初始化的形式,因此C++11開始使用統一的初始化形式,使用者可以用一種通用的形式對各種類型的變量進行初始化,比如說:

int values[] {1, 2, 3};
std::vector<int> v {2, 3, 5, 7, 11, 13, 17};
std::vector<std::string> cities {
    "Berlin", "New York", "London", "Beijing"
    };
std::complex<double> c{4.0,3.0};

C++11提供了std::initializer_list<>的模板讓用戶可以對自定義的類型進行初始化,用法如下:

void print (std::initializer_list<int> vals)
{
    for (auto p=vals.begin(); p!=vals.end(); ++p) {
        std::cout << *p << std::endl;
    }
}

print ({12, 3, 5, 7, 11, 13, 17});

對於initializer_list<>還有一些詳細的語法規則,以後遇到再詳細介紹。
3. for 循環
這是我覺得十分人性化的一個改進,不多說,上例子:

for (int i : {2, 3, 5, 7, 9}) {
    std::cout << i << std::endl;
}

這語法簡直就是shell腳本的同胞兄弟,讀起來簡直讓人神清氣爽,但是現在並沒有多少人真的在一個C程序中使用這種語法。
這種循環語法可以通用的這樣寫:

template <typename T>
void printElements (const T& coll)
{
    for (const auto& elem : coll) {
        std::cout << elem << std::endl;
        statement
    }   
}

這與我們平常用的循環效果一樣,但是看起來會覺得更人性化。
4. Move Semantics and Rvalue References
這一節沒有看懂,不是很理解Rvalue和lvalue是什麼概念,copy assignment operator和move assignment operator也不是很懂,留待以後更新吧。
5. New String Literals
這一節主要就是解決了碰到特殊字符時需要不停加轉義符的困擾,在C++11中可以使用raw string literal 很棒的解決:

R"(\\n)"

等價於

"\\\\n"

有沒有很棒,更棒的是還可以使用分隔符,如:

R"nc(a\
     b\nc()"
     )nc";

等價於

"a\\\n  b\\nc()\"\n  "

從此就不用再去數backslash的數量了。
6. lambdas
其實今天還是我第一次接觸,還並不瞭解lambda的作用體現在哪裏,簡單貼上最簡單的lambda 函數的使用:

[] {
    std::cout << "hello, lambdas" << std::endl;
}

在我現在看來lambda就是一種函數,你可以傳遞給它參數,讓它實現特定功能,返回需要的結果,不知道這和普通的自定義的函數有什麼區別

其實還有一些新特徵我沒有放上來,主要是我還不是很理解那些規則的用處,這一章就寫到這裏了,關於上文中的疑問(用粗體標示),希望以後能夠解決,或者有熱心的朋友可以幫助解答。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章