C++ Primer 第Ⅲ部分笔记——类设计者的工具
1.對象移動
1.1右值引用
右值引用區(qū)別于普通引用,用兩個&表示
返回左值引用的函數(shù),連同賦值、下標(biāo)、解引用和前置遞增遞減運(yùn)算符返回左值
返回非引用的函數(shù),連同算術(shù)、關(guān)系、位以及后置遞增遞減運(yùn)算符都生成右值
我們不能將左值引用綁定到一個右值上,但可以使用const左值引用或右值引用綁定到一個右值上
左值持久,右值短暫
我們不能將右值引用綁定到一個變量上
1.2 標(biāo)準(zhǔn)庫move函數(shù)
位于頭文件utility
int &&i1 = std::move(r2);我們可以使用move函數(shù)將左值強(qiáng)制轉(zhuǎn)換為右值
這也意味著,我們使用move函數(shù)之后可以銷毀對象,也可以給對象賦予一個新值,但我們不能使用這個對象了
1.3移動構(gòu)造函數(shù)和移動賦值運(yùn)算符
移動構(gòu)造函數(shù)的參數(shù)為:類名&&
這里引入一個新名詞 noexcept 不拋出任何異常,在參數(shù)列表后添加
我們在移動構(gòu)造函數(shù)中必須另類中的數(shù)據(jù)成員回歸成可析構(gòu)
移動賦值運(yùn)算符函數(shù)類似,但前提是要檢查返回值和傳進(jìn)來的右值地址是否相同
1.4移動迭代器
函數(shù)make_move_iterator函數(shù)接受一個迭代器,使其成為一個移動迭代器,將其與普通的迭代器使用即可
區(qū)別在于我們使用這個函數(shù)后,這個迭代器以后就無法使用了,另外使用時會觸發(fā)類的移動構(gòu)造函數(shù)
2.重載與調(diào)用函數(shù)對象
2.1 重載后置++--
vec operator++(int) {vec ret = *this;++*this;return ret; }2.2函數(shù)調(diào)用重載
class add { public:int operator() (int i,int j){return i +j;} }; add Add; int i = Add(2,4);2.3 lambda是函數(shù)對象
//假設(shè)有這么一個算法表達(dá)式 stable_sort(words.begin(),words.end(),[](const string&a,const string &b) { return a.size()<b.size(); }); //其行為等價(jià)于 class ShorterString { public:bool operator()(const string&a,const string&b) const {return a.size()<b.size();} }; stable_sort(words.begin(),words.end(),ShorterString());2.4標(biāo)準(zhǔn)庫定義的函數(shù)對象
頭文件:functional
plus<int>add; int i = add(2,4); sort(vec.begin(),vec.end(),greater<int>());//按降序排序2.5可調(diào)用對象于function
int (int,int);//是一個函數(shù)類型,接受兩個int,返回一個int int mod (int i,int j);//普通函數(shù) auto add = [](int i,int j) {return i + j;};//lambda struct divide{int operator() (int i,int j);//函數(shù)對象類 };我們可以通過標(biāo)準(zhǔn)庫function來統(tǒng)一這三種類型
比如我們需要做一個桌面計(jì)算器
map<string,function<int(int,int)>>cal;//定義一個map cal["+"] = add; cal["%"] = mod; cal["/"] = divide();但我們必須注意二義性的問題
如有必要,必須這樣做
int (*p)(int,int)=add; cal["+"] = p;3.重載,類型轉(zhuǎn)換與運(yùn)算符
3.1類型轉(zhuǎn)換運(yùn)算符
基本形式:
operator type() const ;4.類繼承
4.1虛函數(shù)
虛函數(shù)通常在基類前聲明virtual
為了防止派生類的虛函數(shù)并未覆蓋基類中的虛函數(shù),我們必須在派生類虛方法的參數(shù)列表后加上 override
如果將一個函數(shù)設(shè)為final,那么它的派生類不可覆蓋他
4.2回避虛函數(shù)的機(jī)制
必須顯式說明,Base::fun();
4.3抽象基類
若一個基類有一個函數(shù)在參數(shù)列表后加上了 =0
那么該基類成為抽象基類
抽象基類不能顯式聲明
4.4派生類與基類的轉(zhuǎn)換
假設(shè)D繼承B,有三種情況
只有公有繼承能讓用戶能直接使用派生類轉(zhuǎn)換為基類
任何繼承方式,D的成員函數(shù)和友元都可以使用派生類轉(zhuǎn)換為基類
只有公有與保護(hù)繼承,D的成員和友元可以使用轉(zhuǎn)換
轉(zhuǎn)載于:https://www.cnblogs.com/vhyz/p/7450251.html
總結(jié)
以上是生活随笔為你收集整理的C++ Primer 第Ⅲ部分笔记——类设计者的工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于《知网》的词汇语义相似度计算以及复现
- 下一篇: 【功能更新-1:选项统一】利用pytho