1. 程式人生 > >C++ 11特性

C++ 11特性

erro 匹配 編譯速度 void con 函數對象 roc _each 文件

1.auto:自動類型推導

編譯時對變量進行類型推導,不會對程序的運行效率造成影響;

不會影響編譯速度,因為編譯時也要右側推導,然後判斷與左側是否匹配;

通過初始化表達式進行類型推導。

    1. auto a;  // error  如果沒有初始化表達式,就無法確定a的類型

    2. auto i = 1;

    3. auto d = 1.0;

    4. auto str = "hello world";

    5. auto ch = a;

    6. auto func = less<int>();

    7. vector<int
> iv; auto ite = iv.begin(); 8. auto p = new foo(); // 對自定義類型進行類型推導 9. 模板中應用: template <typename Product, typename Creator> void processProduct(const Creator& creator) { Product* val = creator.makeObject(); } // 使用auto templete <typename Creator> void
processProduct(const Creator& creator) { auto val = creator.makeObject(); }

2. decltype:從一個變量或表達式中得到類型

int x = 3;
decltype(x)y = x;

// 應用
template <typename Creator>
auto processProduct(const Creator& creator) -> decltype(creator.makeObject()) {
    auto val = creator.makeObject()
}

3. nullptr:空指針常量

#ifdef __cplusplus ---簡稱:cpp c++ 文件
#define NULL 0
#else
#define NULL ((void *)0)
#endi

解決C++中NULL的二義性,因為NULL實際上代表0;

C++中不能將void *類型的指針隱式轉換成其他指針類型。

4. 序列for循環

遍歷數組、容器、string以及由begin和end函數定義的序列(即有Iterator)

map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
for(auto p : m) {
    cout<<p.first<<":"<<p.second<<endl;
}

5. Lambda表達式

創建並定義匿名的函數對象,簡化編程。

// 語法
// [函數對象參數](操作符重載函數參數)->返回值類型{函數體}
vector<int> iv{5, 4, 3, 2, 1};
int a = 2, b = 1;

for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x+b)<<endl;});  // (1)

for_each(iv.begin(), iv.end(), [=](int &x){x *= (a+b);});  // (2)

for_each(iv.begin(), iv.end(), [=](int &x)->int{return x*(a+b);});  // (3)

[]:可取得的全局變量

(1):b指函數可得到在Lambda表達式外的全局變量

(2)(3):=是可取得所有的外部變量

():每次調用函數時傳入的參數

->後加上的是Lambda表達式返回值的類型

6. 變長參數的模板

// pair可使用make_pair構造
auto p = make_pair(1, "C++ 11");

// 變長參數模板,tuple(1個N元組)
auto t1 = make_tuple(1, 2.0, "C++ 11");
auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});

// Print函數
template<typename head, typename... tail>
void Print(Head head, typename... tail) {
    cout<<head<<endl;
    Print(tail...);
}
// Print中可傳入多個不同種類的參數
Print(1, 1.0, "C++ 11");

7. 智能指針

C++11之後智能指針分為了三種:shared_ptr, unique_ptr, weak_ptr

C++11之後的智能指針的構造函數都有explict關鍵詞修飾,表明它不能被隱式的類型轉換。

shared_ptr<int> p1 = new int(1024);  //這種是不行的,因為等號右邊是一個int*的指針,因為有explict修飾,所以它不能被隱式的轉換為shared_ptr<int>的類型
shared_ptr<int> p2(new int(1024));   //這種是直接采用了初始化的形式

C++ 11特性