亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        探析C++中函數(shù)重載的運(yùn)用

        2008-12-31 00:00:00
        電腦知識(shí)與技術(shù) 2008年28期

        摘要:函數(shù)重載機(jī)制是C++語言中的關(guān)健技術(shù)之一,它允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名定義,編程中合理的使用函數(shù)重載,可以增強(qiáng)程序設(shè)計(jì)的靈活性、擴(kuò)充性和可讀性。

        關(guān)鍵詞:函數(shù)重載;編譯器;覆蓋

        中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)28-0135-02

        Application of Function Overloading in C++

        LIN Yong

        (Department of Computer, Shanxi University of Technology, Hanzhong 723001, China)

        Abstract: Overloaded function is one of the key technology in C++ language,which allows name same definition with similar function withinn the same role.Using of overloaded function rationally in programming can enhance the flexibility, Scalability and readability of the process design.

        Key words: function overload; Compiling device; Cover

        1 引言

        相對(duì)C語言的函數(shù),C++增加了重載(overloaded)機(jī)制。重載機(jī)制既可用于全局函數(shù),也可用于類的成員函數(shù)。函數(shù)的重載也稱多態(tài)函數(shù),對(duì)于沒有重載機(jī)制的C語言,每個(gè)函數(shù)必須有其不同于其它函數(shù)的名稱,即使操作是相同的,僅僅數(shù)據(jù)的類型不同,也需要定義名稱完全不同的函數(shù),這樣就顯得重復(fù)且效率低,而具有重載機(jī)制的C++語言,允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名定義,因而使函數(shù)方便使用,便于記憶,也使程序設(shè)計(jì)更加靈活。

        基于C++相對(duì)于C語言的重載的優(yōu)點(diǎn),合理的使用重載,將大大地提高程序的運(yùn)行效率和代碼的可讀性。

        2 重載的概念

        在C++程序中,可以將語義、功能相似的幾個(gè)函數(shù)用同一個(gè)名字表示,即函數(shù)重載。這樣便于記憶,提高了函數(shù)的易用性。例如下面的函數(shù)EatBeef,EatFish,EatChicken可以用同一個(gè)函數(shù)名Eat表示,用不同類型的參數(shù)加以區(qū)別。

        void EatBeef(…);// 可以改為 void Eat(Beef …);

        void EatFish(…);// 可以改為 void Eat(Fish …);

        void EatChicken(…); // 可以改為 void Eat(Chicken …);

        3 重載實(shí)現(xiàn)的原理

        幾個(gè)同名的重載函數(shù)仍然是不同的函數(shù),如何區(qū)分它們呢?我們自然想到函數(shù)接口的兩個(gè)要素:參數(shù)與返回值。如果同名函數(shù)的參數(shù)不同(包括類型、順序不同),那么它們是不同的函數(shù);如果同名函數(shù)僅僅是返回值類型不同,有時(shí)可以區(qū)分,有時(shí)卻不能。例如:

        void Function(void);

        int Function (void);

        上述兩個(gè)函數(shù),第一個(gè)沒有返回值,第二個(gè)的返回值是int類型。如果有調(diào)用函數(shù)語句:int x = Function();則可以判斷出Function是第二個(gè)函數(shù)。但在C++/C程序中,可以忽略函數(shù)的返回值。在這種情況下,編譯器和程序員就不知道哪個(gè)Function函數(shù)被調(diào)用。所以只能靠參數(shù)而不能靠返回值類型的不同來區(qū)分重載函數(shù)。編譯器根據(jù)參數(shù)為每個(gè)重載函數(shù)產(chǎn)生不同的內(nèi)部標(biāo)識(shí)符。

        但并不是兩個(gè)函數(shù)的名字相同就能構(gòu)成重載。全局函數(shù)和類的成員函數(shù)同名不算重載,因?yàn)楹瘮?shù)的作用域不同。例如:

        void Print(…);// 全局函數(shù)

        class A

        {…

        void Print(…); // 成員函數(shù)

        }

        不論兩個(gè)Print函數(shù)的參數(shù)是否不同,如果類的某個(gè)成員函數(shù)要調(diào)用全局函數(shù)Print,為了與成員函數(shù)Print區(qū)別,全局函數(shù)被調(diào)用時(shí)應(yīng)加‘::’標(biāo)志。例如:

        ::Print(…);// 表示Print是全局函數(shù)而非成員函數(shù)

        4 函數(shù)重載的實(shí)現(xiàn)

        4.1 非成員函數(shù)重載

        非成員函數(shù)重載是C++過程性部分,形式有:

        1) 重載函數(shù)使用不同類型的參數(shù),例如:

        int min(int x,int y) {return x

        double min(int x,int y) {return x

        在調(diào)用過程中,C++編譯器將根據(jù)調(diào)用式中實(shí)參的類型決定調(diào)用哪一個(gè)重載函數(shù),如函數(shù)調(diào)用min(2,3),編譯器將調(diào)用執(zhí)行時(shí)代碼定到第一個(gè)函數(shù)體上,而函數(shù)調(diào)用min(2.5,3.5)就被被編譯器定到第二個(gè)函數(shù)體上。

        2) 重載函數(shù)中使用不同數(shù)目的參數(shù),例如:

        int min(int x,int y) {return x

        int min(int x,int y,int z)

        {int t=x

        trturn t

        C++編譯器將根據(jù)函數(shù)調(diào)用表達(dá)式中實(shí)參的個(gè)數(shù),對(duì)于調(diào)用min(10,20)編譯器確定調(diào)用執(zhí)行代碼是一個(gè)重載函數(shù)的函數(shù)體,對(duì)于調(diào)用min(10,20,30)編譯器確定調(diào)用執(zhí)行代碼是第二個(gè)重載函數(shù)的函數(shù)體。

        因此,在C++中,利用重載機(jī)制把調(diào)用重載工作交給編譯器大大提高了程序的靈活性和擴(kuò)展性。

        4.2 成員函數(shù)重載

        C++類部分,類中的成員函數(shù)也可以被重載,有下面兩種方式:

        1) 類成員函數(shù)重載

        #include

        class List//實(shí)現(xiàn)一個(gè)List類

        {float x,y;

        public:

        List() {x=0.0;y=0.0;}

        List(float x1,float y1) //重載構(gòu)造函數(shù)

        {x=x1;y=y1;}

        void set(float m,float n)

        {List::x=m;

        List::y=n;}

        void set(List p)//重載set成員函數(shù)

        {x=p.x;y=p.y}

        void Length( void)

        {cout<<\"Length of List is\"<<0.0<<\"\";}

        }

        C++允許成員函數(shù)重載為定義類相似但不相同的行為提供了同名方便,使面向?qū)ο蟪绦蛞鬃x同時(shí)易理解。重載構(gòu)造函數(shù)可使對(duì)象方便初始化。類的對(duì)象調(diào)用哪個(gè)重載函數(shù)由C++編譯器根據(jù)調(diào)用表達(dá)式中的參數(shù)個(gè)數(shù)、類型匹配重載成員函數(shù),例如:List a,b(1.0,2.0); 定義兩個(gè)對(duì)象,對(duì)a編譯器調(diào)用List()函數(shù),對(duì)b編譯器調(diào)用List(1.0,2.0)函數(shù)。

        2) 派生類中對(duì)基類成員函數(shù)的重載

        派生類繼承了基類的所有功能,基類操作可作用于派生類對(duì)象。但派生類是基類的繼承,還增加了一些新的函數(shù)成員和數(shù)據(jù)成員,補(bǔ)充新的操作,如:

        #include

        class circle:public point

        {float r;

        public:

        circle(point p,int r1):point(p) //類circle構(gòu)造函數(shù)

        {r=r1;}

        void area()

        {cout<<\"area of circle of\"<<r<<\"is\"<<3.1416*r*r;}}

        void main()

        {point p1(2,10),*p2;

        circle c(p1,1);

        p2=p1; p2->area();

        p2=c;p2->area();}

        程序運(yùn)行結(jié)果為area of point is 0.0area of point is 0.0

        原因是:circie類重載了基類point的成員函數(shù)area(),要求輸出的內(nèi)容不同。當(dāng)主函數(shù)main()中調(diào)用area()時(shí),C++編譯器就要決定哪一個(gè)area()函數(shù)被調(diào)用。一般情況下,類能有效地解決重載問題,p2是point的一個(gè)對(duì)象,p2.point()將調(diào)用point::area();c是circle的一個(gè)對(duì)象,c.area()將調(diào)用circle::area()。在表達(dá)式p2->area();中我們希望當(dāng)p2 指向類point的一個(gè)對(duì)象時(shí),調(diào)用point::area(),而當(dāng)p2 指向類circle的一個(gè)對(duì)象時(shí),就調(diào)用circle::area(),但c++對(duì)重載函數(shù)進(jìn)行先期聯(lián)編且派生類具有基類功能。因此,C++編譯依據(jù)c++的基類決定調(diào)用基類point聲明的函數(shù),為此程序執(zhí)行后的結(jié)果數(shù)據(jù)是0.0,而不是希望的3.1416。

        上述為c++繼承機(jī)制應(yīng)用多態(tài)性技術(shù)利用虛函數(shù)解決基類和派生類成員函數(shù)重載問題,從而實(shí)現(xiàn)一個(gè)接口,多種方法,給c++面向?qū)ο蟮某绦蛟黾恿遂`活性、可擴(kuò)充性。

        5 隱式類型轉(zhuǎn)換導(dǎo)致重載函數(shù)產(chǎn)生二義性

        先看下面的程序段:

        # include <iostream.h>

        void output(int x); // 函數(shù)聲明

        void output(float x);// 函數(shù)聲明

        void output(int x)

        { cout << \"output int\" << x << endl; }

        void output( float x)

        { cout << \"output float\" << x << endl; }

        void main(void)

        { int x = 1;

        float y = 1.0;

        output(x); // output int 1

        output(y); // output float 1

        output(1); // output int 1

        // output(0.5); // error! ambiguous call, 因?yàn)樽詣?dòng)類型轉(zhuǎn)換

        output(int(0.5)); // output int 0

        output(float(0.5)); // output float 0.5

        }

        上面的程序代碼中:第一個(gè)output函數(shù)的參數(shù)是int類型,第二個(gè)output函數(shù)的參數(shù)是float類型。由于數(shù)字本身沒有類型,將數(shù)字當(dāng)作參數(shù)時(shí)將自動(dòng)進(jìn)行類型轉(zhuǎn)換(稱為隱式類型轉(zhuǎn)換)。語句output(0.5)將產(chǎn)生編譯錯(cuò)誤,因?yàn)榫幾g器不知道該將0.5轉(zhuǎn)換成int還是float類型的參數(shù)。隱式類型轉(zhuǎn)換在很多地方可以簡化程序的書寫,但是也可能留下隱患。

        6 重載與覆蓋的區(qū)別

        覆蓋是指派生類函數(shù)覆蓋基類函數(shù)。重載與覆蓋的區(qū)別主要由它們的特征所決定。成員函數(shù)被重載的特征:相同的范圍(在同一個(gè)類中);函數(shù)名字相同;參數(shù)不同;virtual關(guān)鍵字可有可無。覆蓋的特征是:不同的范圍(分別位于派生類與基類);函數(shù)名字相同;參數(shù)相同;基類函數(shù)必須有virtual關(guān)鍵字。

        7 值得注意的隱藏規(guī)則

        僅僅區(qū)別重載與覆蓋并不算困難,但是C++的隱藏規(guī)則使問題復(fù)雜性陡然增加。這里“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:

        1) 如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。

        2) 如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋混淆)。

        8 結(jié)束語

        綜上所述,通過從概念、定義、使用及使用規(guī)則等方面對(duì)C++函數(shù)的重載進(jìn)行了探討,以便在編程時(shí)合理的使用重載,有助于提高程序的運(yùn)行效率和代碼的可讀性。

        參考文獻(xiàn):

        [1] 鄭莉. C++語言程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2000.

        [2] 劉斌. 面向?qū)ο蟪绦蛟O(shè)計(jì)Visual C++[M]. 北京:清華大學(xué)出版社,2003.

        [3] 揣錦華. C++程序設(shè)計(jì)語言[M]. 西安:西安電子科技大學(xué)出版社,2003.

        [4] 張國峰. C++語言及其程序設(shè)計(jì)教程[M]. 北京:電子工業(yè)出版社,1997.

        欧美丰满熟妇aaaaa片| AV中文字幕在线视| 91极品尤物在线观看播放| 青青久久精品一本一区人人| 蜜臀久久99精品久久久久久| 18禁黄网站禁片免费观看女女| 俺去俺来也在线www色官网| 专区国产精品第一页| 国产日韩欧美视频成人| 我的美艳丝袜美腿情缘| 国产a级毛片久久久精品毛片| 男受被做哭激烈娇喘gv视频| 日韩精品国产自在欧美| 婷婷成人亚洲综合国产| 久久一区二区三区老熟女| 精品国产天堂综合一区在线| 天天爽夜夜爽夜夜爽| 女同中的p是什么意思| 天堂av中文在线官网| 国产高清一区二区三区三州| 特黄 做受又硬又粗又大视频| 国产成人一区二区三区| 亚洲av无码男人的天堂在线| 国产一区二区牛影视| 久久人妻少妇中文字幕| 日本一区二区高清精品| 国产欧美日韩一区二区加勒比| 久久综合给合综合久久| 欧美在线日韩| 中文亚洲第一av一区二区 | 水蜜桃精品视频在线观看| 国产乱人对白| 欧美色aⅴ欧美综合色| 亚洲av人片在线观看调教| 国产99一区二区三区四区| 玩中年熟妇让你爽视频| 欧美色图中文字幕| 亚洲精品在线观看自拍| 国产区女主播一区在线| 真人新婚之夜破苞第一次视频| 国产精品无需播放器|