亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

[BoolanC++微專業] Week4筆記

2019-11-08 00:41:52
字體:
來源:轉載
供稿:網友

一、conversion function; 一開始想在網上找一找關于conversion function的信息,但是只有在MSDN上找到只言片語: https://msdn.microsoft.com/en-us/library/5s5sk305.aspx This content has been relocated. For information about conversion functions, see User-Defined Type Conversions (C++). 好吧巨硬你贏了。 還是從侯捷老師的程序開始講起吧。

class Fraction{public: Fraction(int num, int den = 1):m_numerator(num), m_denominator(den) {} Operator double() const { return (double) (m_numberator / m_denominator); }PRivate: int m_numerator; int m_denominator;}

當程序運行如下時:

Fraction f(3,5);double d = 4 + f;

如果沒有定義

friend Fraction operator+(const double &lhs,const Fraction &rhs)

那么在一般意義上,+號會報錯。 但是在類Fraction中有:

operator double() const{}

這個函數,意味著它可以在需要的時候,將類Fraction的實例轉double。

從另一個方向來說:

class Fraction{public: Fraction(int num, int den = 1):m_numerator(num), m_denominator(den) {} Fraction operator+(const Fraction &rhs){}private: int m_numerator; int m_denominator;}

此時運行

Fraction d2 = f + 4;

會調用構造函數,將4轉化為Fraction(4,1),然后調用Fracion operator+。

然而當Fraction(),operator+,operator double()同時存在時,再次調用就會出現二義性,編譯器無法分辨到底應該調用哪一個函數。但是這幾個函數都是有必要存在的,怎么辦? 此時可以在 Fraction()前加上explicit 修飾詞,此時,此構造函數不可以用于隱式地創建Fraction對象。 關鍵字只對一個實參的構造函數有效,需要多個構造函數不能用于執行隱式轉換,所以無需將這些構造函數指定為explicit的。 當我們用explicit關鍵字聲明構造函數時,它將只能以直接初始化的形式使用,而且編譯器不會在自動轉換中使用該構造函數。

二、智能指針: 智能指針類似于vector,它也是一個模板,讓我們創建一個只能指針時,也必須提供額外的信息—-指針指向的類型。默認初始化的智能指針中保存著一個空指針。 由于智能指針只是一個模板類,所以需要重載’*’與’->’來達到與指針相似的用法,

T& operator*() const{}T& operator->() const {}

關于*運算符的重載,大家應該都沒有什么異議,關于->運算符重載大家肯定由疑問。 比如程序如下:

shared_ptr<Foo> sp (new Foo);sp->method();

此時由于(sp->)method()調用運算符重載,那么不會變成(ptr)methon()這種類型么? 群友在 https://www.ibm.com/support/knowledgecenter/SS2LWA_12.1.0/com.ibm.xlcpp121.bg.doc/language_ref/cplr329.html 找到了解答。

The statement x->f() is interpreted as (x.operator->())->f().

The operator-> is used (often in conjunction with the pointer-dereference operator) to implement “smart pointers.” These pointers are objects that behave like normal pointers except they perform other tasks when you access an object through them, such as automatic object deletion (either when the pointer is destroyed, or the pointer is used to point to another object), or reference counting (counting the number of smart pointers that point to the same object, then automatically deleting the object when that count reaches zero).

這個是C++中約定俗稱的一種語法,這個鍋主要還是要甩給’.’運算符無法進行重載,所以給’->’一個特殊的重載形式。

三、迭代器:

An iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators (with at least the increment (++) and dereference (*) operators).

The most obvious form of iterator is a pointer: A pointer can point to elements in an array, and can iterate through them using the increment operator (++). But other kinds of iterators are possible. For example, each container type (such as a list) has a specific iterator type designed to iterate through its elements.

Notice that while a pointer is a form of iterator, not all iterators have the same functionality of pointers; Depending on the properties supported by iterators, they are classified into five different

迭代器是一個類,但是它歸根究底,還是用指針實現的。比較簡單,并沒有什么好講的。

四、仿函數: 其實它的本質就是一個重載了()運算符的類。

// this is a functorstruct add_x { add_x(int x) : x(x) {} int operator()(int y) const { return x + y; }private: int x;};// Now you can use it like this:add_x add42(42); // create an instance of the functor classint i = add42(8); // and "call" itassert(i == 50); // and it added 42 to its argumentstd::vector<int> in; // assume this contains a bunch of values)std::vector<int> out(in.size());// Pass a functor to std::transform, which calls the functor on every element // in the input sequence, and stores the result to the output sequencestd::transform(in.begin(), in.end(), out.begin(), add_x(1)); assert(out[i] == in[i] + 1); // for all i

五、模板: 模板是c++泛型編程的基礎,一個模板就是創建類或者函數的藍圖或者說公式。 一個函數模板就是一個公式,可以用來生成針對特定類型的函數的版本。

這里寫圖片描述

類模板同理,但是類模板不能一依靠編譯器為類模板推斷參數類型,我們必須在模板名后的<>內提供額外信息,用來代替模板參數的實參列表,編譯器用這些模板實參來實例化特定的類。

這里寫圖片描述

模板的參數遵循普通的作用域原則,一個模板參數的名字的可用范圍是在其聲明之后,至模板參數定義結束之前。在模板內不可以重用模板參數名。 與函數中類似,聲明中的模板參數的名字不用與定義中相同。

一個類可以包含本身是模板的成員函數。這種函數稱為成員模板。

成員模板不能為虛函數。

為了實例化一個類函數的成員模板,我們必須同時提供類和函數模板的實參。

六、模板模板參數: 主要優點在于:借助于某個依賴于模板參數的類型,就很容易讓類模板攜帶一些狀態信息(也就是靜態成員變量)。 這里寫圖片描述

在使用模板模板參數時,需要注意

cCls<string, list> mylist1;

出錯的原因在于list模板其實有兩個模板參數。 如果想要寫成上面這種形式,要不就用using或者typedef將其轉化為類型別名,要不就將template<>內的模板參數與實際傳入的相匹配。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产综合新一区| 日韩欧中文字幕| 欧美精品激情视频| 日韩国产中文字幕| 国产精品视频yy9099| 亚洲色图激情小说| 中文字幕一区电影| www.亚洲天堂| 国产精品wwww| 久久91精品国产91久久跳| 日日摸夜夜添一区| 国产成人高潮免费观看精品| 国产精品爽黄69天堂a| 在线播放日韩av| 韩国三级日本三级少妇99| 91精品国产自产在线观看永久| 亚洲香蕉av在线一区二区三区| 精品亚洲一区二区三区四区五区| 亚洲视频日韩精品| 欧美高清无遮挡| 久久999免费视频| 国产在线观看精品一区二区三区| 亚洲天堂色网站| 欧美中文字幕精品| 国内免费精品永久在线视频| 欧美性生活大片免费观看网址| 91国产视频在线播放| 97视频免费在线观看| 欧美韩国理论所午夜片917电影| 欧美亚洲在线播放| 成人午夜小视频| 日韩在线中文视频| 中文欧美在线视频| 亚洲最新av在线网站| 亚洲精品国产精品国自产在线| 日韩中文字幕视频| 亚洲老司机av| 成人两性免费视频| 国产精品爽爽ⅴa在线观看| 性日韩欧美在线视频| 欧美成人精品不卡视频在线观看| 高跟丝袜一区二区三区| 亚洲综合中文字幕在线| 国产精品免费在线免费| 久久久久久免费精品| 午夜欧美大片免费观看| 日韩欧美在线网址| 国产日产久久高清欧美一区| 97久久精品人人澡人人爽缅北| 日韩av三级在线观看| 国产精品丝袜一区二区三区| 亚洲精品免费一区二区三区| 日韩电视剧免费观看网站| 国内免费精品永久在线视频| 久久久久久久久久久免费| 一区二区三区国产在线观看| 国产97色在线|日韩| 91高清视频免费观看| 欧美亚洲视频在线看网址| 欧美成人精品一区二区三区| 欧美日韩亚洲网| 欧美在线视频a| 久久夜精品va视频免费观看| 亚洲影院色无极综合| 欧美午夜女人视频在线| 成人有码视频在线播放| 国产成人一区二| 国产视频丨精品|在线观看| 久久精品中文字幕免费mv| 国产精品视频自在线| 日韩在线视频网| 日韩乱码在线视频| 98视频在线噜噜噜国产| 久久久久久12| 亚洲国产精品一区二区三区| 欧美日韩亚洲精品内裤| 国产91精品久久久久久久| 97国产成人精品视频| 欧美精品电影免费在线观看| 亚洲精品电影久久久| 91免费看片网站| 亚洲男人天堂2019| 欧美色欧美亚洲高清在线视频| 国产丝袜高跟一区| 国产日韩精品入口| 亚洲一区二区三区乱码aⅴ| 性亚洲最疯狂xxxx高清| 不卡中文字幕av| 一本一道久久a久久精品逆3p| 亚洲性生活视频在线观看| 亚洲精品国产电影| 成人黄色免费网站在线观看| 国产精品美腿一区在线看| 成人午夜高潮视频| 欧美性极品少妇精品网站| 69av在线播放| 国产精品热视频| 亚洲va久久久噜噜噜久久天堂| 91精品国产91久久久久久吃药| 久久高清视频免费| 久久精视频免费在线久久完整在线看| 日韩精品视频免费在线观看| 精品偷拍各种wc美女嘘嘘| 91在线精品视频| 欧美丰满少妇xxxxx做受| 欧美亚洲另类激情另类| 欧美大成色www永久网站婷| 国产精品jizz在线观看麻豆| 欧美在线视频在线播放完整版免费观看| 精品国产31久久久久久| 亚洲欧洲日产国产网站| 久久99亚洲精品| 欧美日韩999| 亚洲欧美综合区自拍另类| 亚洲成**性毛茸茸| 亚洲国产成人精品久久久国产成人一区| 久久久久久久国产精品视频| 宅男66日本亚洲欧美视频| 久久久久久欧美| 国产成人自拍视频在线观看| 日韩一区二区三区在线播放| 欧美日韩国产成人在线观看| 国产精品久久久精品| 久久999免费视频| 亚洲va欧美va国产综合剧情| 热久久免费视频精品| 日av在线播放中文不卡| 亚洲欧美一区二区三区情侣bbw| 久久久久久中文字幕| 成人午夜高潮视频| 日韩亚洲国产中文字幕| 夜夜躁日日躁狠狠久久88av| 久久久久日韩精品久久久男男| 久久精品国产一区二区电影| 国产在线播放91| 91久久久久久久一区二区| 国产精品极品美女粉嫩高清在线| 91国产高清在线| 精品国产999| 亚洲欧美日韩久久久久久| 正在播放欧美视频| 欧美—级高清免费播放| 成人福利网站在线观看11| 国内精品视频一区| 神马久久桃色视频| 精品亚洲一区二区三区| 欧美性猛交xxxx黑人猛交| 精品久久久久久久久中文字幕| 中文字幕成人精品久久不卡| 亚洲精品综合精品自拍| 992tv在线成人免费观看| 国产亚洲成精品久久| 久久久久久综合网天天| 精品久久久久久久久中文字幕| 亚洲国产精品推荐| 91国内免费在线视频| 亚洲日本aⅴ片在线观看香蕉| 国产91成人在在线播放| 久久亚洲欧美日韩精品专区| 日韩欧美在线视频日韩欧美在线视频| 亚洲欧美在线一区二区| 国产女人精品视频| 欧美人与性动交a欧美精品| 成人天堂噜噜噜|