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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

發布時間:2025/3/21 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在看侯捷的《STL源碼剖析》,雖然感覺自己c++看得比較深一點,還是感覺還多東西不是那么明白,這里將一些細小的東西或者概念記錄一下。

有些東西是根據《C++編程思想》理解的,記錄一下加深印象。

STL沒有太多的OO(object oriented),基本思想是GP(Generic Programming)。模板是泛型編程最基礎的東西。

這里主要針對1.9節 可能令你困惑的C++語法 所列出來的組態進行講解,因為書上基本沒什么講解。

1、模板 template

1.1 默認模板參數

很簡單的類似于函數的默認參數,只要在后面加等于具體的類名即可以了。

如:template<class T, class U = char> void f() {?T a;?U b; };

1.2 typename

?如果在用模板定義的函數內如果不用typename標出類名,則只能把標示符當做類的靜態成員,可以訪問,但卻不能新建類型,

如下代碼:id為嵌套的類型。此時typename的作用是通知編譯器,被限定的標示符為一個類型。

template<typename T> class M{//typename T::id i;T::id i; public:void f(){ i.g();} };class X{ public:class id{public:void g(){cout <<"x" <<endl;};}; };

當沒有typename時,無法定義i,但是我用函數時確實可以的,如下:

template<typename T> void func(){T::id i;i.g(); } int main(){func<X>();system("pause");}

可能是不同編譯器的原因,為了程序穩定性,模板編程過程中還是最好用typename。

1.3 模板類型推斷

在實例化類模板時,總是需要使用尖括號并且提供所有的非默認模板參數;然而在實例化函數模板時,經常可以省略模板參數。

如:

template< typename T> const T& min(const T& a, const T& b){return (a<b)? a:b;}

可以通過加尖括號來調用,也可以不,讓編譯器從函數的參數中推斷出模板的類型,這就是類型推斷。

如調用min可以如下:

int i,j;int z= min(i,j); 但此時i,j類型必須完全一致,如果不一致,即使可以進行類型轉換(如int 和 float),但是編譯器依然會報錯,此時必須明確指出模板類型。

1.4 偏特化

一般的往往將偏特化理解為給定模板中的部分模板參數以具體的類,余下的泛化。其實不然,在本書3.4節traits編程技法一節,提到,“所謂partial specialization 的意思是提供另一份template的定義式,而其本身仍為templatized。”,“針對(任何)template參數更進一步的條件限制所設計出來的一個特化版本”。

全特化就是所有的模板都為具體的類。

T* 特化允許用指針類型匹配的模式(也只能匹配指針類型),const T* 特化允許使用指向const的指針 類型匹配(也只能匹配指向const的指針)。

注意,類模板可以偏特化,而函數模板不可以偏特化,即函數名后不可以加<>,但是可以通過重載達到類似偏特化的效果。

當有好多個版本的函數符合模板函數規則時,為了避免二義性,編譯器總是選擇特化程度最高的的模板。

如 template<class T,class U> void f() { T a; U b; };

某個特化版本為 template<> void f<int,char>() {?int a;?char b; };

某個偏特化版本為 template<class U> void f<int,U>() {?int a;?U b; };


1.5模板和友元(主要是限定友元)bound friend templates

class template 的某個具體實現與friend function template的某個具體實現有一對一的關系。

友元函數模板必須提前聲明,本書中寫到GCC中不需要前置聲明。

如下,f()為Friendly類的友元函數,都為模板。此例中兩者都是int的示例,注意Friendly中的f的聲明里尖括號(或者<T>,不寫也很容易推斷),訴編譯器f是一個模板,而不是普通函數,否則編譯器就會找普通函數而找不到。

template<class T> class Friendly; template<class T> void f(const Friendly<T>&);template<class T> class Friendly{T t; public:Friendly(const T& theT):t(theT){}friend void f<>(const Friendly<T>&);void g(){f(*this);} };template<class T> void f(const Friendly<T>& fo){cout << fo.t << endl; } void h(){f(Friendly<int>(1)); }int main(){h();Friendly<int>(2).g(); } 

總結

以上是生活随笔為你收集整理的《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美变态另类刺激 | 午夜天堂av | 久色国产| 成人羞羞国产免费动态 | 9i看片成人免费看片 | 成人午夜激情视频 | 国产欧美视频一区二区三区 | 国产精品一区二区三区免费看 | 久久久久综合网 | 日韩免费av| 人人澡人人草 | 7mav视频| 亚洲成熟丰满熟妇高潮xxxxx | 黄色av免费在线观看 | a级淫片| 免费看一区二区三区 | 女人被狂躁60分钟视频 | 人妻一区二区三区四区 | h片在线播放| 粉嫩av网 | 一区二区男女 | 自拍偷拍校园春色 | 热久久最新 | 又黄又爽又色的视频 | 国产欧美一区二区三区在线 | 一区二区在线 | 成人区人妻精品一区二区网站 | 日韩av在线中文字幕 | 午夜亚洲国产 | 日本天天操| 国产成人观看 | 亚洲xx站 | 日韩精品一区二区三区中文字幕 | 色婷婷国产精品 | 欧美日本二区 | 午夜欧美成人 | 黑料av在线| 一区视频网站 | 国产亚洲精品一区二区三区 | 台湾少妇xxxx做受 | 教练含着她的乳奶揉搓揉捏动态图 | 日皮视频在线观看 | 男女性生活视频网站 | 成人av无码一区二区三区 | 亚洲综合色站 | 在线免费激情视频 | 超碰97人人草| 国产浪潮av | 95香蕉视频 | 精品一区二区三区视频 | 亚洲经典三级 | 麻豆免费观看视频 | 精品亚洲乱码一区二区 | 福利片在线看 | 日韩免费视频一区二区视频在线观看 | 欧美性色19p | 久久久久久久久久久久91 | 欧美大片一区二区 | 午夜av在线播放 | 久草青青视频 | 久久影院午夜理论片无码 | 成人aaaaa| 青青草国产成人99久久 | 蜜桃av免费 | 韩国19主播内部福利vip | 国产在线观看99 | 欧美在线视频第一页 | 欧美精品99久久久 | 欧美精品一区二区蜜臀亚洲 | 蜜桃传媒 | 91精品视频一区 | 成人听书哪个软件好 | 午夜一二三 | 一本大道东京热无码 | 国产毛片av| 亚洲人成小说 | 日韩欧美福利 | 国产51页| 新红楼梦2005锦江版高清在线观看 | 一区二区三区三区在线 | 毛片av在线播放 | av小次郎收藏 | 911精品| 亚洲jlzzjizz少妇 | 蜜桃av一区二区 | 亚洲欧美一区二区三区在线 | 日韩中文字幕在线播放 | 国产一级色 | 日日夜夜网站 | 国产真实偷伦视频 | 日韩精品在线观看一区二区三区 | 亚洲手机在线 | 亚洲色图88 | h欧美| 久久人人爽爽人人爽人人片av | 久久久香蕉网 | 操日本老太太 | 在线高清av | 国产天堂精品 |