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

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

關于C++臨時對象的概念

2020-02-24 14:37:25
字體:
來源:轉載
供稿:網友

關于C++臨時對象或許大家對這個概念還不太了解,那我們就得花一些時間來了解這臨時對象了,因為對于接下來C++的學習挺重要的,在這個學習過程中,或許能增加見識,體驗其中的樂趣喔。

首先看下面一端代碼:


?#include
?void swap( int &a,int &b)
?{
???? int temp;
???? temp=a;
???? a=b;
???? b=temp;
?}

?int main(int argc,char** argv)
?{
???? int a=1,b=2;
???? swap(a,b);
???? std::cout ???? return 0;
?}


?結果為
?2-----1??
?可能大多數園友,認為"int temp"是"臨時對象",但是其實不然,"int temp"僅僅是swap函數的局部變量。

?

臨時對象是代碼中看不到的,但是實際程序中確實存在的對象。臨時對象是可以被編譯器感知的。


為什么研究臨時對象?
主要是為了提高程序的性能以及效率,因為臨時對象的構造與析構對系統開銷也是不小的,所以我們應該去了解它們,知道它們如何造成,從而盡可能去避免它們。

臨時對象建立一個沒有命名的非堆對象會產生臨時對象。(不了解什么是堆對象和非堆對象,可以參考C++你最好不要做的這一博文,這里面有介紹。)這種未命名的對象通常在三種條件下產生:為了使函數成功調用而進行隱式類型轉換時候、傳遞函數參數和函數返回對象時候。

那么首先看看為了使函數成功調用而進行隱式類型轉換。


?#include
? int countChar(const std::string & s,const char c)
? {
????? int count=0;
????? for(int i=0;i ????? {
????????? if(*(s.c_str( )+i) == c)
????????? {
????????????? count++;
???????? }
??? }
???? return count;
?}

?int main(int argc,char** argv)
?{
???? char buffer[200];
???? char c;
???? std::cout ???? std::cin>>buffer;
???? std::cout ???? std::cin>>c;
???? int count=countChar(buffer,c);
???? std::count ???? return 0;
?}


結果為:

?

?

?

?

?

這里調用函數countChar(const std::string& s,const char& c),那么我們看看這個函數的形參是const std::string &s,形參類型為const std::string,但是實際上傳遞的是char buffer[200]這個數組。其實這里編譯器為了使函數調用成功做了類型轉換,char *類型轉換為了std::string類型,這個轉換是通過一個賦值構造函數進行的,以buffer做為參數構建一個std::string類型的臨時對象。當constChar返回時,即函數撤銷,那么這個std::string臨時對象也就釋放了。但是其實從整個程序上來說臨時對象的構造與釋放是不必要的開銷,我們可以提高代碼的效率修改一下代碼避免無所謂的轉換。所以知道臨時對象的來源,可以對程序性能上有一個小小提升。

?? 注意僅當通過傳值方式傳遞對象或者傳遞常量引用參數,才會發生這類型的轉換,當傳遞非常量引用的參數對象就不會發生。因為傳遞非常量的引用參數的意圖就是想通過函數來改變其傳遞參數的值,但是函數其實是改變的類型轉換建立的臨時對象,所以意圖無法實現,編譯器干脆就直接拒絕。

第二種情況是大家熟悉的函數傳遞參數的時候,會構造對應的臨時對象。看下面一段代碼運行的結果想必就一清二楚了。


?#include
?class People
?{
???? public:
???????? People(std::string n,int a)
???????? :name(n),age(a)
???????? {
???????????? std::count ???????? }
??????? People( )
??????? {
??????????? std::count ??????? }
??????? People(const People& P)
??????? {
??????????? name=p.name;
??????????? age=p.age;
??????????? std::cout ??????? }
??????? std::string name;
??????? int age;
};

?

void swap(People p1,People p2)
{
??? People temp;
??? temp.age=p1.age;
??? temp.name=p1.name;
??? p1.age=p2.age;
??? p1.name=p2.name;
??? p2.age=temp.age;
??? p2.name=temp.name;
}

int main(int argc, char ** argv)
{
??? People p1("tom",18),p2("sam",19);
??? swap(p1,p2);
??? return 0;
}


結果為:

?


?

這里分析下前面兩個"h2"是通過調用構造函數People(std::string n,int a)打印出來的,而"h3"就是通過調用復制構造函數People(const People&)而建立臨時對象打印出來的,h1是調用默認構造函數People( )打印出來的。那么怎么避免臨時對象的建立呢?很簡單,我們通過引用實參而達到目的

void swap(People &p1,People &p2)
第三種情景就是函數返回對象時候。這里要注意臨時對象的創建是通過復制構造函數構造出來的。

例如?? const Rationanl operator+(Rationanl a,Rationanl b)該函數的返回值的臨時的,因為它沒有被命名,它只是函數的返回值。每回必須為調用add構造和釋放這個對象而付出代價。


?#include
?class Rationanl
?{
???? public:
???????? Rationanl(int e,int d)
???????? :_elemem(e),_denom(d)
???????? {
???????????? std::cout ???????? }
???????? void show( ) const;
???????? int elemem() const {return _elemem;}
???????? int denom() const {return _denom;}
???????? void? setElemon(int e){_elemon=e;}
???????? void? setDenom(int d) {_denom=d;}
???????? Rationanl(const Rationanl &r);
???????? Rationanl & operator=(const Rationanl &r);
???? private:
???????? int _elemem;
???????? int _denom;
?};
?Rationanl::Rationanl(const Rationanl &r)
?{
???? setElemon(r.elemon( ));
???? setDenom(r.denom( ) );
???? std::cout ?}
?Rationanl & Rationanl::operator=(const Rationanl &r)
?{
???? setElemon(r.elemon( ));
???? setDenom(r.denom( ) );
???? std::cout ???? return *this;
?}

?void Rationanl::show( )
?{
???????? std::cout ?}
?const Rationanl operator*(const Rationanl lhs,const Rationanl rhs)
?{
???? return Rational result(lhs.elemen*rhs.elemen,rhs.denom*rhs.denom);
?}

?int main(int argc,char **argv)
?{
???? Rationanl r1(1,2),r2(1,3)
???? Rationanl r3=r1*r2;??? //GCC做了優化,沒有看到臨時變量。編譯器直接跳過建立r3,使用賦值符號
???? r3.show( );
???? //相當于? (r1*r2).show( );
???? return 0;
?}


結果為:

?



這里很可惜沒有看到我們想到看到的結果,結果應該為h2,h2,h2,h3,h4,應該是在返回值的時候有一個賦值構造函數,建立臨時變量的,后來經武林小編網上查找資料證實GCC做了優化。

以上就是小編分享的關于C++臨時對象的概念,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人女保姆的销魂服务| 成人女保姆的销魂服务| 91在线观看欧美日韩| 另类美女黄大片| 国产精品美女主播在线观看纯欲| 欧美电影在线播放| 久久久这里只有精品视频| 中文字幕欧美亚洲| 97免费视频在线| 国产亚洲欧洲在线| 主播福利视频一区| 欲色天天网综合久久| 欧美一级bbbbb性bbbb喷潮片| 亚洲免费人成在线视频观看| 伊人久久大香线蕉av一区二区| 国产色婷婷国产综合在线理论片a| 成人国产精品久久久久久亚洲| 欧美性极品xxxx做受| 国产丝袜精品第一页| 日av在线播放中文不卡| 日韩男女性生活视频| 亚洲精品美女在线观看| 亚洲福利影片在线| 亚洲一区二区三区四区在线播放| 亚洲电影免费观看| 国产ts人妖一区二区三区| 日日噜噜噜夜夜爽亚洲精品| 欧美一级在线亚洲天堂| 国产精品一区二区av影院萌芽| 欧美黑人国产人伦爽爽爽| 不卡在线观看电视剧完整版| 国产精品va在线| 国产精品视频中文字幕91| 青青草一区二区| 欧美激情视频在线| 色老头一区二区三区在线观看| 亚洲女同性videos| 国产精品欧美风情| 中文字幕精品影院| 亚洲a∨日韩av高清在线观看| 国产男人精品视频| 日韩在线一区二区三区免费视频| 亚洲成人黄色网| 久久人人爽人人爽人人片av高清| 日韩精品www| 日韩资源在线观看| 中文国产亚洲喷潮| 精品国产91久久久久久老师| 亚洲欧美在线x视频| 亚洲人成在线电影| 国产九九精品视频| 亚洲精品国产成人| 精品无人国产偷自产在线| 亚洲最大激情中文字幕| 国产欧美一区二区三区视频| 中文字幕亚洲欧美一区二区三区| 国产精品久久久久久久久久久久| 韩国精品美女www爽爽爽视频| 中文字幕精品一区二区精品| 中文字幕精品www乱入免费视频| 91精品国产91久久久久久不卡| 欧美一级黑人aaaaaaa做受| 欧美成人免费全部| 日本久久久久久久久久久| 亚洲视频在线视频| 亚洲自拍偷拍第一页| 精品成人乱色一区二区| 日本一区二区三区在线播放| 夜夜嗨av色一区二区不卡| 欧美性xxxxx极品娇小| 午夜精品久久久久久久白皮肤| 秋霞午夜一区二区| 亚洲激情第一页| 欧美成人午夜激情| 亚洲精品小视频在线观看| 欧美视频免费在线观看| 538国产精品一区二区在线| 最近2019好看的中文字幕免费| 久久天堂av综合合色| 精品亚洲永久免费精品| 久久青草精品视频免费观看| 欧洲一区二区视频| 97热在线精品视频在线观看| 亚洲国产精品久久精品怡红院| 国产一区二中文字幕在线看| 992tv成人免费视频| 久久久久北条麻妃免费看| 色婷婷久久一区二区| 亚洲激情视频在线观看| 中文字幕视频一区二区在线有码| 精品中文字幕在线观看| 国产精品99久久久久久白浆小说| 亚洲а∨天堂久久精品喷水| 668精品在线视频| 精品久久久久久亚洲国产300| 亚洲精品视频免费在线观看| 久久精品中文字幕免费mv| 成人伊人精品色xxxx视频| 国产精品高潮呻吟久久av无限| 久久精品福利视频| 亚洲精品videossex少妇| 成人午夜黄色影院| 久久精视频免费在线久久完整在线看| 亚洲国产天堂网精品网站| 亚洲国产成人久久综合| 在线视频日本亚洲性| 欧美成人精品在线| 欧美日韩在线视频一区| 91精品国产91久久久久久| 亚洲系列中文字幕| 夜夜嗨av一区二区三区四区| 亚洲国内精品视频| 91精品久久久久久久久久久久久久| 中文字幕亚洲二区| 综合136福利视频在线| 九九精品视频在线| 日韩欧美亚洲一二三区| 精品久久久久久久久国产字幕| 国产精品91视频| 亚洲人成绝费网站色www| 国内成人精品一区| 国产精品美女免费| 伊人久久五月天| 久久久999国产精品| 欧美日韩国产综合新一区| 久久99青青精品免费观看| 欧美亚州一区二区三区| 欧美大胆在线视频| 国产精品免费观看在线| 国产精品高清网站| 亚洲色图狂野欧美| 欧美激情国产日韩精品一区18| 热久久美女精品天天吊色| 日韩精品在线观看一区二区| 中文字幕日韩欧美在线| 国内精品久久久久久中文字幕| 欧美亚洲国产成人精品| 亚洲深夜福利网站| 日韩成人激情在线| 日韩精品中文在线观看| 国产欧洲精品视频| 久久久最新网址| 国产美女直播视频一区| 久久精品成人一区二区三区| 欧美大尺度在线观看| 欧美电影在线观看网站| 日韩av免费观影| 国产精品嫩草影院一区二区| 亚洲专区国产精品| 国产日韩精品视频| 精品av在线播放| 91精品久久久久久久久久久久久久| 国产一区二区黄| 91精品国产色综合| 亚洲全黄一级网站| 国产亚洲精品久久久久久777| 成人日韩在线电影| 成人午夜两性视频| 亚洲影院色在线观看免费| 日韩免费中文字幕| 日韩欧美国产视频| 欧美成人黄色小视频| 欧美—级高清免费播放| 69国产精品成人在线播放|