最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++你最好不要做的幾點小結

 更新時間:2013年01月02日 16:51:41   作者:  
整理如下,主要是方便剛開始接觸c++的朋友

1、最好不要使用引用返回值

有同學在傳遞的參數(shù)的時候使用引用方式傳遞,避免了臨時對象的創(chuàng)建,提高了效率,那么在返回值的時候能不能使用引用呢?

看如下代碼

復制代碼 代碼如下:

        class Rational{
        public:
            Raional( int numerator = 0, int denominator =1);
            ...
        private:
            int d, d;
            friend Rational operator* (const Rational& lhs, const Raional& rhs) ;
        };
       Rational Rational::operator* (const Rational& lhs,const Raionl&rhs)
        {
                return Rational  result(lhs.n*rhs.n,lhs.d*rhs.d);
        }
    }  
   
    這個類就是我們前面所介紹的有理數(shù)類。這里想想會發(fā)生一次類的構造與類的析構,那么如果使用引用就可以避免這個問題嗎?達到提高效率嗎?

函數(shù)創(chuàng)建新對象有兩種方法,一個是在棧(statck)中創(chuàng)建,一個是在堆(heep)中創(chuàng)建。

復制代碼 代碼如下:

        People p(a,b)                  //棧中創(chuàng)建
        People *p = new People(a,b)   //堆中創(chuàng)建
 
 現(xiàn)在首先考慮在棧中創(chuàng)建,但是這個創(chuàng)建的變量是一個局部變量,會在退出函數(shù)之前銷毀。
復制代碼 代碼如下:

   const Rational& operator* (const Rational& lhs, const Rational & rhs)
        {
            Rational  result(lhs.n*rhs.n,lhs.d*rhs.d);
            return result;
        }  

 在函數(shù)內(nèi)以stack方式空間創(chuàng)建對象是局部對象,任何函數(shù)如果返回一個引用指向某個局部對象,都會發(fā)生錯誤。因為局部對象在函數(shù)退出之前被銷毀了,意味著reference所指的對象不存在。
      于是考慮在堆中創(chuàng)建
復制代碼 代碼如下:

const Rational& operator* (const Rational& lhs, const Rational & rhs)
        {
            Rational*  result=new Rational(lhs.n*rhs.n,lhs.d*rhs.d);
            return *result;
        } 
 
 現(xiàn)在又發(fā)現(xiàn)了一個問題,new出來的對象由誰來delete?好這個問題先占時不考慮看下面情況
復制代碼 代碼如下:

          Rational w,x,y,z;
          w=x*y*z;      
  
   這里同時一個語句調(diào)用了兩次operator*,意味著new了兩次,也就需要delete兩次。但是這里沒有合理的辦法讓opertaor*使用者進行那些delete調(diào)用,因為無法讓使用者獲取返回的指針,這將導致資源泄漏。
      于是考慮返回一個引用,其指向定義于函數(shù)內(nèi)部的static Rational對象。
復制代碼 代碼如下:

const Rational & operator*(const Rational& lhs,const Rational & rhs)
        {
            static Rational result;
            result = ...;
            return result;
        }
 
 那么顯而易見就是多線程,在多線程環(huán)境下,這樣寫安全嗎?好如果說不關多線程。那么如下代碼會發(fā)生什么?
復制代碼 代碼如下:

  bool operator == (const Rational& lhs, const Rational&  rhs);
    ...
    Raional a,b,c,d;
    if((a*b) == (c*d)
    {
            ...
    }   
   
    上述if語句表達式無論a,b,c,d為何值都是true,因為它們都指向同一個靜態(tài)值。

2、最好不要將所有變量定義放在語句開頭。

有同學可能上過C語言課程,喜歡學習C的,喜歡將所有的變量定義放在開頭,但是在C++中,我建議最好不要這樣做,因為定義一個變量時,程序便注定需要進行一次構造與析構。例如在下面程序:大概意思我們允許1米8以下并且年齡在60歲以下的同學買票進入。

復制代碼 代碼如下:

 class People{...};
 class Ticket{...};
 bool Isvalid(const People&p){...}
 void Banding(const People& p,Ticket& t);
 Ticket buyTicket(const People& p)
 {
     Ticket t;
     if(Isvalid(p)){ return NULL };
     //信息與票綁定
    Banding(p,&t);
    return t;
}

假如這里檢測買票人條件不符合,那么就不能進入買票從而進行信息與綁定操作,那么這里Ticket t語句就讓該函數(shù)白白承受了一次Ticket構造成本與析構的成本。
所以最好不要將變量提前定義,最好在要用到的時候定義,避免不必要的性能開銷。上面例子改成下面這樣即可:

復制代碼 代碼如下:

 class People{...};
 class Ticket{...};
 bool Isvalid(const People&p){...}
 void Banding(const People& p,Ticket& t);
 Ticket buyTicket(const People& p)
 {
     if(Isvalid(p)){ return NULL };
     Ticket t;
     //信息與票綁定
     Banding(p,&t);
     return t;
 }


3、最好不要做過多的類型轉(zhuǎn)換

C++規(guī)則的設計目標之一是,保證“類型錯誤”絕不可能發(fā)生。理論上程序通過編譯,就表示它并不企圖在任何身上執(zhí)行任何不安全,荒謬的操作??上ь愋娃D(zhuǎn)換破環(huán)了類型系統(tǒng),它可能導致任何種類麻煩,有些非常麻煩。就例如本文最后一個代碼例子。C和C++都支持隱形類型轉(zhuǎn)換,同時C++有四種顯示轉(zhuǎn)換操作符。成員函數(shù)與非成員函數(shù)的抉擇里有介紹。但是建議最好不要做過多的類型轉(zhuǎn)換,能避免就避免。類型轉(zhuǎn)換往往也不是按照你的意思,首先看一個例子:

復制代碼 代碼如下:

 #include <iostream>
 class base
 {
     public:
         base():a(0),b(0){}
         base(const int& x,const int& y)
         :a(x),b(y){}
         virtual void init()
        {
            a=5;
            b=5;
            std::cout<<"in base a value is "<<a<<std::endl;
            std::cout<<"in base b value is "<<b<<std::endl;
        }

        int get_a() const
        {
            return a;
        }

        int get_b() const
        {
            return b;
        }
    private:
        int a;
        int b;
};

class derived:public base
{
    public:
        derived(int x,int y):base(x,y){}
        void init()
        {
            static_cast<base>(*this).init();
        }
};


運行結果為
in base a value is 5
in base b value is 5
a value is 2
b value is 2

這里將derived類型轉(zhuǎn)化為base,但是調(diào)用base::init()函數(shù)并不是當前對象上的函數(shù),而是早前轉(zhuǎn)型動作所建立的一個"*this對象的base的副本,所以當我們嘗試改變對象內(nèi)容,其實改變的是副本內(nèi)容,其對象內(nèi)容并沒有被改變。

如何解決這個問題呢?我們可以直接聲明調(diào)用基類的函數(shù)

復制代碼 代碼如下:

class derived:public base
{
    public:
        derived(int x,int y):base(x,y){}
        void init()
        {
            //static_cast<base>(*this).init();
            base::init();
        }
};

運行結果為:
in base a value is 5
in base b value is 5
a value is 5
b value is 5

或許此時你記起來應該使用dynamic_case(如果看過以前的文章的話:它用于安全地沿著繼承關系向下進行類型轉(zhuǎn)換)。使用dynamic_cast直接出現(xiàn)錯誤。

復制代碼 代碼如下:

 class derived:public base
 {
     public:
         derived(int x,int y):base(x,y){}
         void init()
         {
             //static_cast<base>(*this).init();
             //base::init();
             dynamic_cast<base*>(this)->init();
         }
 };

運行結果為:

段錯誤 ((主存儲器)信息轉(zhuǎn)儲)假設一個類有五層的單繼承關系,如果在該對象上執(zhí)行dynaic_cast,那么會有多達五次的strcmp調(diào)用,深度或者多重繼承的越多,成本越高。之所以需要dynamic_cast是因為想在derived class對象上執(zhí)行 derived class操作函數(shù),但是目前只有一個指向base的指針或者引用,這個時候可以用它們來處理。

相關文章

  • 詳解約瑟夫環(huán)問題及其相關的C語言算法實現(xiàn)

    詳解約瑟夫環(huán)問題及其相關的C語言算法實現(xiàn)

    這篇文章主要介紹了詳解約瑟夫環(huán)問題及其相關的C語言算法實現(xiàn),也是ACM當中經(jīng)常會引用到的基礎題目,文中共介紹了三種C語言解答,需要的朋友可以參考下
    2015-08-08
  • C語言數(shù)據(jù)結構鏈表隊列的實現(xiàn)

    C語言數(shù)據(jù)結構鏈表隊列的實現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結構鏈表隊列的實現(xiàn)的相關資料,需要的朋友可以參考下
    2017-07-07
  • 基于Qt實現(xiàn)系統(tǒng)主題感知功能

    基于Qt實現(xiàn)系統(tǒng)主題感知功能

    在現(xiàn)代桌面應用程序開發(fā)中,系統(tǒng)主題感知是一項重要的功能,它使得應用程序能夠根據(jù)用戶的系統(tǒng)主題設置(如深色模式或淺色模式)自動調(diào)整其外觀,Qt 作為一個跨平臺的C++圖形用戶界面應用程序開發(fā)框架,提供了豐富的工具和類來實現(xiàn)這一功能,需要的朋友可以參考下
    2024-12-12
  • 方陣順時針旋轉(zhuǎn)的實現(xiàn)代碼

    方陣順時針旋轉(zhuǎn)的實現(xiàn)代碼

    以下是關于方陣順時針旋轉(zhuǎn)的實現(xiàn)代碼。需要的朋友參考下
    2013-05-05
  • C++中異常處理的基本思想及throw語句拋出異常的使用

    C++中異常處理的基本思想及throw語句拋出異常的使用

    這篇文章主要介紹了C++中異常處理的基本思想及throw類拋出異常的使用,也深入談到了異常被拋出后的棧解旋unwinding過程,需要的朋友可以參考下
    2016-03-03
  • 如何利用C語言實現(xiàn)最簡單的HTTP服務器詳解

    如何利用C語言實現(xiàn)最簡單的HTTP服務器詳解

    這篇文章主要給大家介紹了關于如何利用C語言實現(xiàn)最簡單的HTTP服務器的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C語言具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • C/C++程序設計的基本概念詳解

    C/C++程序設計的基本概念詳解

    這篇文章主要介紹了C++程序設計的基本概念詳解,文中有非常詳細的C語言使用教程及相關基礎知識,對正在學習c語言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • C++表達式求值詳解

    C++表達式求值詳解

    下面小編就為大家?guī)硪黄獪\談C++ 語言中的表達式求值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • VSCode (Visual Studio Code) V1.43.0下載并設置成中文語言的方法

    VSCode (Visual Studio Code) V1.43.0下載并設置成中文語言的方法

    Visual Studio Code是一款免費開源的現(xiàn)代化輕量級代碼編輯器,支持語法高亮、智能代碼補全、自定義熱鍵、括號匹配、代碼片段、代碼對比 Diff、GIT 等特性,這篇文章主要介紹了VSCode (Visual Studio Code) V1.43.0下載并設置成中文語言,需要的朋友可以參考下
    2020-03-03
  • C++結構體字節(jié)對齊示例

    C++結構體字節(jié)對齊示例

    這篇文章主要為大家介紹了C++結構體字節(jié)對齊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

乐都县| 烟台市| 格尔木市| 古田县| 临西县| 色达县| 新闻| 大新县| 诸暨市| 日土县| 南投市| 澄城县| 通道| 陕西省| 定南县| 喀什市| 丰都县| 柳林县| 庆阳市| 民勤县| 闸北区| 界首市| 拜泉县| 桃江县| 鄯善县| 福海县| 长兴县| 崇仁县| 井冈山市| 田东县| 礼泉县| 剑川县| 东乌珠穆沁旗| 太仆寺旗| 泸水县| 高唐县| 古蔺县| 阳原县| 武胜县| 东方市| 额济纳旗|