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

C++你可能不知道地方小結(jié)

 更新時間:2013年01月02日 16:40:00   作者:  
c++中編譯器替我們完成了許多事情,我們可能不知道,但也可能習(xí)以為常
下面詳細介紹

一、初始化與初始賦值
首先說說類的初始化與初始賦值之前的區(qū)別,這也許里面可能有我們不知道的事情。
其實類初始化與初始賦值還是有區(qū)別的。
復(fù)制代碼 代碼如下:

class People{
public:
People(std::string name,int age,int height);
private:
std::string m_sName;
int m_iAge;
int m_iHeight;
}
//賦值
People::People(std::string name,int age,int height)
{
m_sName=name;
m_iAge=age;
m_iHeight=height;
}
//初始化列表
People::People(std::string name,int age,int height)
:m_sName(name),m_iAge(age),m_iHeight(height)
{}

C++規(guī)定,對象的成員變量初始化動作發(fā)生在進入構(gòu)造函數(shù)本體之前。在構(gòu)造函數(shù)內(nèi)成員變量賦值都不是初始化,而是賦值。
賦值時首先調(diào)用默認構(gòu)造函數(shù)為m_sName,m_iAge,m_iHeight賦初始值,然后在立刻調(diào)用賦值操作符進行賦新值。
成員初始列表是將各個成員變量實參都作為復(fù)制構(gòu)造函數(shù)的實參。
所以看出賦值相對于初始化,多了一步就是使用賦值操作符進行賦值。所以初始化的效率比賦值的效率高多了。但是對于內(nèi)置類型,它們效率是一樣的。

二、空類
  想想你如果聲明一個空類,C++編譯器會對它做什么呢?編譯器就會為它聲明一個復(fù)制構(gòu)造函數(shù),賦值操作符和一個析構(gòu)函數(shù),以及默認構(gòu)造函數(shù)。所有這些函數(shù)都是public而且inline函數(shù)。
編譯器寫的賦值構(gòu)造函數(shù)和賦值操作符,只是單純地將來源對象的每個non-static變量拷貝到目標對象,具體是進行位拷貝。
如果聲明了一個構(gòu)造函數(shù),編譯器是不會創(chuàng)建默認構(gòu)造函數(shù)。
  如果不希望類支持拷貝構(gòu)造函數(shù)與賦值操作符怎么辦?不聲明?按照上面說明編譯器會自動幫你生成。那么可以將它們聲明為private,這樣阻止編譯器自動生成拷貝構(gòu)造函數(shù)(public)。private成功阻止他人使用,但是這并不安全。因為類成員函數(shù)以及友元函數(shù)還是可以調(diào)用private的拷貝構(gòu)造函數(shù)和賦值操作符。
如果只在private下聲明拷貝函數(shù)和賦值操作符,在有人通過類成員函數(shù)去以及member函數(shù)去調(diào)用它,會獲得一個連接錯誤。那么這里能不能將錯誤在編譯的時候體現(xiàn)出來呢?這里只用將拷貝函數(shù)聲明為private,并且不在自身,就可以辦到了。顯然繼承一個拷貝函數(shù)和賦值操作符為private的基類就辦到了,基類如下:
復(fù)制代碼 代碼如下:

class NonCopyable{
         protected:
                  NonCopyable (){}
                 ~  NonCopyable (){}
         private:
              NonCopyable (const  NonCopyable &);
              NonCopyable & operater=(const  NonCopyable &);
         };

原因是類成員函數(shù)或者友元函數(shù)嘗試拷貝對象,編譯器便會嘗試生成一個復(fù)制構(gòu)造函數(shù)與賦值操作符,并會調(diào)用基類的對應(yīng)函數(shù),但是會被拒絕,因為基類這些函數(shù)是private。

3、++函數(shù)

  下面說說“*++"與"++*"中你不知道的事情,c++規(guī)定后綴形式自加函數(shù)有一個int類型參數(shù),當函數(shù)被調(diào)用時,便其一傳遞一個0作為int參數(shù)的值傳遞給該函數(shù),而前綴形式自己函數(shù),類型參數(shù)沒有要求,所以這樣就能區(qū)分一個++函數(shù)是前綴形式與后綴形式了,具體代碼如下:
復(fù)制代碼 代碼如下:

class UPInt{
public
UPInt& operator++( ) ; //++ 前綴
const UPInt operator++( int ); //++后綴
UPInt& operator --( ); // --前綴
const UPInt operator --( int ) //--后綴
UPInt& operator +=( int ); //
...
};

UPInt & UPInt::operator++( )
{
*this += 1;
return *this;
}

const UPInt UPInt :: operator++( int )
{
UPInt oldValue = *this;
++(*this);
return oldValue;
}

后綴函數(shù)使用返回參數(shù)類型const,是為了避免下面代碼生效
復(fù)制代碼 代碼如下:

 UPInt i;
 i++++;

這個時候第一次調(diào)用++返回cosnt對象,并再次調(diào)用然后這個函數(shù)是non-const成員函數(shù),所以const對象無法調(diào)用這個函數(shù),那么i++++就無法生效了。
這里說說效率問題,我們可以看到后綴++函數(shù)建立一個臨時對象以作為它返回值,這個臨時對象經(jīng)過構(gòu)造并在最后被析構(gòu)。而前綴++函數(shù)沒有這樣的臨時變量,并且沒有那樣的操作。所以如果我們在程序中使用前綴++效率會更加高一些,沒有了臨時變量的構(gòu)造與析構(gòu)的動作。

4.虛析構(gòu)函數(shù)
帶有多態(tài)性質(zhì)的base class應(yīng)該聲明一個virtual析構(gòu)函數(shù)。
為什么這么說呢?看下面例子
復(fù)制代碼 代碼如下:

        class base
        { ... }
        class derived:public base
        {... }

        base * p= new derived;    
 
 假設(shè)這里基類的析構(gòu)函數(shù)不是virtual,當使用完p指針,我們刪除它的時候,想想會發(fā)生什么,因為基類的析構(gòu)函數(shù)是non-virtual所以不會發(fā)生多態(tài)直接調(diào)用基類析構(gòu)函數(shù),僅僅刪除繼承類中基類那部分內(nèi)容,那么繼承類對象其他內(nèi)存沒有被銷毀,從而資源泄漏。
    如果將其聲明為virtual,那么就會發(fā)生多態(tài),調(diào)用的是指向繼承類的指針,那么就會銷毀的是整個繼承類象。

5.傳遞方式用引用
 缺省情況下c++以值傳遞方式傳遞對象至函數(shù)。函數(shù)參數(shù)都是以實際實參的復(fù)件為初值,而調(diào)用端所獲得的是函數(shù)返回值的一個附件。這些復(fù)件都是由拷貝構(gòu)造函數(shù)產(chǎn)出??慈缦吕?
復(fù)制代碼 代碼如下:

class Person{
         public:
             Person();
             virtual ~Person();
             ...
         private:
             std::string name;
             std::string address;
         }

         class Student:public Person{
         public:
             Student();
             ~Student();
             ...
         private:
             std::string schoolName;
             std::string schoolAddress;
         };


那么如果有一個函數(shù)驗證是否為學(xué)生
復(fù)制代碼 代碼如下:

bool validateStudent(Student s);
Student plato;
bool platoIsOK=validateStudent(plato);  

分析這3行代碼,編譯器到底做了什么?首先調(diào)用Student的copy構(gòu)造函數(shù),然后以plato為藍本將s初始化,當validateStudent返回被銷毀,所以成本為"一次Student copy構(gòu)造函數(shù)調(diào)用,加上一次Student析構(gòu)函數(shù)調(diào)用"。
Student對象內(nèi)部有兩個string對象,所以構(gòu)造了兩個string對象。Student繼承自Person對象,里面又有兩個string對象。所以by value方式傳遞一個Student對象,總體成本是"六次構(gòu)造函數(shù)和六次析構(gòu)函數(shù)"!

以by reference方式傳遞參數(shù)也可避免對象切割問題。當一個derived class對象以by value方式傳遞并被視為一個base class對象,base class的copy構(gòu)造函數(shù)會被調(diào)用,造成像derived class對象全被切割掉了,僅僅留下base class對象??慈缦麓a通過傳遞引用參數(shù)完成多態(tài)

復(fù)制代碼 代碼如下:

class Window{
public:
...
std::string name() const;
virtual void display() const;
};
class WindowWithScrollBars:public Window{
public:
...
virtual void display() const;
};

//傳入Windos類型,調(diào)用其display函數(shù)
//傳入WindowWithScrollBars類型,調(diào)用其display函數(shù)
//體現(xiàn)多態(tài)
void printNameAndDispaly(const Window& w)
{
std::cout<<w.name();
w.display();
}

窺視c++編譯器的底層,reference往往以指針實現(xiàn)出來,因此pass by reference真正傳遞的是指針。如果對象屬于內(nèi)置型,pass by value往往比pass by reference 效率高些。

相關(guān)文章

  • C語言中楊氏矩陣與楊輝三角的實現(xiàn)方法

    C語言中楊氏矩陣與楊輝三角的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C語言中楊氏矩陣與楊輝三角的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++?用紅黑樹模擬實現(xiàn)set、map的示例代碼

    C++?用紅黑樹模擬實現(xiàn)set、map的示例代碼

    set、map的底層結(jié)構(gòu)是紅黑樹,它們的函數(shù)通過調(diào)用紅黑樹的接口來實現(xiàn),本文主要介紹了C++?用紅黑樹模擬實現(xiàn)set、map,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C語言深入講解函數(shù)的使用

    C語言深入講解函數(shù)的使用

    各位小伙伴們,今天YU同學(xué)給大家?guī)淼氖桥c函數(shù)相關(guān)的知識,本篇將會帶著大家初步認識和調(diào)用函數(shù)來解決一些簡單的問題
    2022-04-04
  • 基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    數(shù)據(jù)結(jié)構(gòu)作為每一個IT人不可回避的問題,本文基于C++編寫,下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • C語言 詳細講解邏輯運算符的使用

    C語言 詳細講解邏輯運算符的使用

    在C語言中,邏輯運算符有&&、||、!;&&表示“與”的意思,需要兩端的表達式的值都為true,該式的值才為true。||表示“或”的意思,兩端的表達式的值只要有一端為true,該式的值就為true。!表示“非”的意思,將該式的真值換成相反的真值,即false和true互換
    2022-04-04
  • C++輕量級界面開發(fā)框架ImGUI介紹小結(jié)

    C++輕量級界面開發(fā)框架ImGUI介紹小結(jié)

    如果從事過C++?Windows客戶端開發(fā),大家對MFC、Qt、DuiLib等各種DirectUI應(yīng)該有了解,本篇給大家介紹一個超級輕量級的C++開源跨平臺圖形界面框架ImGUI,感興趣的可以了解一下
    2021-11-11
  • VSCode配置C/C++環(huán)境的最新詳細教程

    VSCode配置C/C++環(huán)境的最新詳細教程

    VisualStudioCode(簡稱VSCode)是Microsoft開發(fā)的代碼編輯器,它支持Windows,Linux和macOS等操作系統(tǒng)以及開源代碼,下面這篇文章主要給大家介紹了關(guān)于VSCode配置C/C++環(huán)境的最新詳細教程,需要的朋友可以參考下
    2022-12-12
  • Qt使用QListWidget實現(xiàn)自定義Item

    Qt使用QListWidget實現(xiàn)自定義Item

    這篇文章主要為大家詳細介紹了Qt如何使用QListWidget實現(xiàn)自定義Item的效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 關(guān)于C++的強制類型轉(zhuǎn)換淺析

    關(guān)于C++的強制類型轉(zhuǎn)換淺析

    C++的強制類型轉(zhuǎn)換是我們在日常開發(fā)中經(jīng)常會遇到的,下面這篇文章主要給大家介紹了關(guān)于C++強制類型轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • C語言三分鐘精通時間復(fù)雜度與空間復(fù)雜度

    C語言三分鐘精通時間復(fù)雜度與空間復(fù)雜度

    算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度。其作用:?時間復(fù)雜度是度量算法執(zhí)行的時間長短;而空間復(fù)雜度是度量算法所需存儲空間的大小
    2022-02-02

最新評論

清镇市| 嫩江县| 石台县| 肇庆市| 金堂县| 富源县| 肇庆市| 乌苏市| 盘锦市| 乐至县| 沙田区| 吕梁市| 永城市| 丰顺县| 岚皋县| 常熟市| 淮南市| 望城县| 蕲春县| 衡南县| 沈丘县| 比如县| 通江县| 耒阳市| 河源市| 穆棱市| 汉沽区| 壤塘县| 万盛区| 白城市| 清涧县| 通许县| 锦州市| 宁强县| 大安市| 拜城县| 清镇市| 大宁县| 灌阳县| 景宁| 秦安县|