第一天

c++11新特性

自動(dòng)類(lèi)型推導(dǎo) (auto)

編譯期間
auto 必須對(duì)變量進(jìn)行初始化
auto 不能在函數(shù)的參數(shù)使用
auto 不能定義數(shù)組

auto ptr = new auto(10); 
std::unique_ptr<int> ptr = std::make_unique<int>(10);
auto ptr = std::make_unique<int>(10);
類(lèi)型推導(dǎo) (decltype)

RTTI(Run- Time Type Identification)運(yùn)行時(shí)類(lèi)型識(shí)別
運(yùn)行時(shí)類(lèi)型識(shí)別的缺陷是降低程序運(yùn)行的效率
推演表達(dá)式類(lèi)型作為變量的定義類(lèi)型
推演函數(shù)返回值的類(lèi)型
type(decltype()).name() decltype帶上參數(shù) 否則是函數(shù)首地址

基于范圍的for循環(huán)
for(const auto &:)
{
}

列表初始化

類(lèi)里面有const成員變量初始化 必須列表初始化

智能指針

內(nèi)存管理

#include<memory>
shared_ptr use_count獲取共享計(jì)數(shù)值
test *p = new test();
std::share_ptr<test> sp(p);
std::share_ptr<test> sp1(new test());
std::share_ptr<test> sp2(sp);
reset()改變指向 
避免通過(guò)同一個(gè)裸指針創(chuàng)建多個(gè)shared_ptr對(duì)象
避免通過(guò)this指針創(chuàng)建shared_ptr對(duì)象
class CTest:public std::enable_shared_from_this<CTest>
用到this 地方 shared_from_this()
引用計(jì)數(shù)的遞增和遞減是原子操作的
std::shared_ptr<int> sp = std::make_shared<int>(18);
weak_ptr
用來(lái)表示臨時(shí)所有權(quán)(弱引用,不會(huì)增加引用計(jì)數(shù)) 
需要臨時(shí)所有權(quán) 將其轉(zhuǎn)換為shared_ptr 對(duì)象的引用計(jì)數(shù)會(huì)加1
use_count() expired() lock()
//多線程里是危險(xiǎn)的 
if(!wp.expired())
{
    std::shared_ptr<int> sp(wp);
}
std::share_ptr<int> sp = wp.lock();
std::this_thread::sleep_for(std::chrono::seconds(3));
避免循環(huán)引用
unique_ptr 獨(dú)占所有權(quán) 沒(méi)有拷貝語(yǔ)義(沒(méi)有賦值構(gòu)造函數(shù)和賦值函數(shù)) 只有移動(dòng)語(yǔ)義
release() 返回指向被管理對(duì)象的指針 并釋放所有權(quán)
reset()   替換被管理的對(duì)象
swap()    交換被管理的對(duì)象
std::unique_ptr<CTest>p1(new CTest(1));
std::unique_ptr<CTest>p2(new CTest(2));
p1 = std::move(p2);
p2.reset(p1.release());
release 只是釋放所有權(quán) 并不會(huì)釋放對(duì)象
容器存入 unique_ptr 需要借助于 std::move
unique_ptr支持動(dòng)態(tài)數(shù)組
移動(dòng)語(yǔ)義與右值引用

避免不必要的深拷貝,提升性能
std::move:將左值轉(zhuǎn)換為右值引用,啟用移動(dòng)語(yǔ)義(不移動(dòng)任何東西,只是類(lèi)型轉(zhuǎn)換)
std::forward:完美轉(zhuǎn)發(fā),保持參數(shù)原有值類(lèi)別(左值/右值)

Lambda 表達(dá)式

捕獲列表 [capture]:
[]:不捕獲任何外部變量
[=]:以值捕獲所有外部變量
[&]:以引用捕獲所有外部變量
[x, &y]:混合捕獲
[this]:捕獲當(dāng)前類(lèi)的this指針

新的容器和算法

無(wú)序容器(哈希表):
std::unordered_map<K, V>
std::unordered_set<T>
std::unordered_multimap<K, V>
std::unordered_multiset<T>
std::array<T, N>:固定大小的數(shù)組,比原生數(shù)組更安全
std::forward_list<T>:?jiǎn)蜗蜴湵恚瑑?nèi)存開(kāi)銷(xiāo)更小

多線程支持 需要深入后續(xù)再補(bǔ)充

線程管理:std::thread
互斥鎖:std::mutex, std::lock_guard, std::unique_lock
條件變量:std::condition_variable
異步操作:std::async, std::future, std::promise
原子操作:std::atomic<T>

nullptr:類(lèi)型安全的空指針替代NULL宏
constexpr:聲明編譯期常量表達(dá)式
static_assert:編譯期斷言
override 和 final:明確虛函數(shù)重寫(xiě)和禁止繼承/重寫(xiě)
委托構(gòu)造函數(shù):一個(gè)構(gòu)造函數(shù)可以調(diào)用同一類(lèi)的另一個(gè)構(gòu)造函數(shù)
繼承構(gòu)造函數(shù):使用 using Base::Base; 繼承基類(lèi)構(gòu)造函數(shù)
強(qiáng)類(lèi)型枚舉 enum class

enum class Color { Red, Green, Blue };
Color c = Color::Red; // 必須帶作用域,不會(huì)隱式轉(zhuǎn)換為整數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容