日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 第Ⅲ部分笔记——类设计者的工具

發(fā)布時間:2023/12/9 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 第Ⅲ部分笔记——类设计者的工具 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.對象移動

1.1右值引用

右值引用區(qū)別于普通引用,用兩個&表示

返回左值引用的函數(shù),連同賦值、下標、解引用和前置遞增遞減運算符返回左值

返回非引用的函數(shù),連同算術(shù)、關(guān)系、位以及后置遞增遞減運算符都生成右值

我們不能將左值引用綁定到一個右值上,但可以使用const左值引用或右值引用綁定到一個右值上

左值持久,右值短暫

我們不能將右值引用綁定到一個變量上

1.2 標準庫move函數(shù)

位于頭文件utility

int &&i1 = std::move(r2);

我們可以使用move函數(shù)將左值強制轉(zhuǎn)換為右值

這也意味著,我們使用move函數(shù)之后可以銷毀對象,也可以給對象賦予一個新值,但我們不能使用這個對象了

1.3移動構(gòu)造函數(shù)和移動賦值運算符

移動構(gòu)造函數(shù)的參數(shù)為:類名&&

這里引入一個新名詞 noexcept 不拋出任何異常,在參數(shù)列表后添加

我們在移動構(gòu)造函數(shù)中必須另類中的數(shù)據(jù)成員回歸成可析構(gòu)

移動賦值運算符函數(shù)類似,但前提是要檢查返回值和傳進來的右值地址是否相同

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è)有這么一個算法表達式 stable_sort(words.begin(),words.end(),[](const string&a,const string &b) { return a.size()<b.size(); }); //其行為等價于 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標準庫定義的函數(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ù)對象類 };

我們可以通過標準庫function來統(tǒng)一這三種類型

比如我們需要做一個桌面計算器

map<string,function<int(int,int)>>cal;//定義一個map cal["+"] = add; cal["%"] = mod; cal["/"] = divide();

但我們必須注意二義性的問題

如有必要,必須這樣做

int (*p)(int,int)=add; cal["+"] = p;

3.重載,類型轉(zhuǎn)換與運算符

3.1類型轉(zhuǎn)換運算符

基本形式:

operator type() const ;

4.類繼承

4.1虛函數(shù)

虛函數(shù)通常在基類前聲明virtual

為了防止派生類的虛函數(shù)并未覆蓋基類中的虛函數(shù),我們必須在派生類虛方法的參數(shù)列表后加上 override

如果將一個函數(shù)設(shè)為final,那么它的派生類不可覆蓋他

4.2回避虛函數(shù)的機制

必須顯式說明,Base::fun();

4.3抽象基類

若一個基類有一個函數(shù)在參數(shù)列表后加上了 =0

那么該基類成為抽象基類

抽象基類不能顯式聲明

4.4派生類與基類的轉(zhuǎn)換

假設(shè)D繼承B,有三種情況

只有公有繼承能讓用戶能直接使用派生類轉(zhuǎn)換為基類

任何繼承方式,D的成員函數(shù)和友元都可以使用派生類轉(zhuǎn)換為基類

只有公有與保護繼承,D的成員和友元可以使用轉(zhuǎn)換

轉(zhuǎn)載于:https://www.cnblogs.com/vhyz/p/7450251.html

總結(jié)

以上是生活随笔為你收集整理的C++ Primer 第Ⅲ部分笔记——类设计者的工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。