在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C/C++之面向?qū)ο缶幊趟枷?

jf_78858299 ? 來源:小余的自習室 ? 作者:小余的自習室 ? 2023-03-30 15:16 ? 次閱讀

運算符重載函數(shù)

運算符重載,就是對已有的運算符重新進行定義,賦予其另一種功能,簡化操作 讓已有的運算符 適應(yīng)不同的數(shù)據(jù)類型

  • 格式:
    重載+=號運算 ==>operator+=
    重載+運算符 ==>operator+ 
    ...
    

下面舉兩個運算符重載例子:

  • 1.重載+號
    class Complex {
      public:
        Complex() {
    
        }
        double real, imag;
        Complex(double _real, double _imag):
            real(_real),imag(_imag)
        {
            cout << "real:" << real << " imag:" << imag << endl;
        }
        void print() {
            cout << "real:" << real << " imag:" << imag << endl;
        }
        Complex(const Complex& c) {
            real = c.real; imag = c.imag;
            cout << "complex copy" << endl;
        }
        //以全局函數(shù)的形式重載
        friend Complex operator+(const Complex& c1, const Complex& c2);
    
    };
    Complex operator+(const Complex& c1, const Complex& c2) {
        Complex _c;
        _c.real = c1.real + c2.real;
        _c.imag = c1.imag + c2.imag;
        return _c;
    }
    Complex func() {
        Complex c(1.0, 2.0);
        Complex c1(2.0, 3.0);
        Complex c2 = c + c1;
        return c2;
    }
    
    void extendsTest::mainTest()
    {   
        cout << func().real << endl;
    };
    運行結(jié)果:
    real:1 imag:2
    real:2 imag:3
    complex copy
    complex copy
    3
    
  • 2.重載+=號運算 代碼如下:
    class Complex {
      public:
        ...
        //成員函數(shù)重載
        Complex& operator+=(const Complex& c);
      };
    
    Complex & Complex::operator+=(const Complex& c1) {
        this->real += c1.real;
        this->imag += c1.imag;
        return *this;
    }
    Complex func() {
        Complex c(1.0, 2.0);
        Complex c1(2.0, 3.0);
        c += c1;
        return c;
    }
    void extendsTest::mainTest()
    {   
        cout << func().real << endl;
    };
    運行結(jié)果:
    real:1 imag:2
    real:2 imag:3
    complex copy
    3
    
運算符重載的限制

多數(shù)C++運算符都可以重載,重載的運算符不必是成員函數(shù),但必須至少有一個操作數(shù)是用戶定義的類型。

    1. 重載后的運算符必須至少有一個操作數(shù)是用戶定義的類型 ,防止用戶為標準類型重載運算符。如:不能將減法運算符(-)重載為計算兩個 double 值的和,而不是它們的差。雖然這種限制將對創(chuàng)造性有所影響,但可以確保程序正常運行。
    1. 使用運算符時不能違反運算符原來的句法規(guī)則 。例如,不能將求模運算符(%)重載成使用一個操作數(shù):int x;Time shiva;%x;%shiva;,且不能修改運算符的優(yōu)先級。
    1. 不能創(chuàng)建新運算符 。例如,不能定義operator **()函數(shù)來表示求冪。
  • 4.不能重載下面的運算符。

    圖片

運算符重載涉及的知識點還是比較多的,后期文章會單獨出一期講解。

多態(tài)

多態(tài)是指:函數(shù)調(diào)用的多種形態(tài),使用多態(tài)可以使得不同的對象去完成同一件事時,產(chǎn)生不同的動作和結(jié)果

C++中多態(tài)分為 靜態(tài)多態(tài)和動態(tài)多態(tài)

靜態(tài)多態(tài)

靜態(tài)多態(tài)的核心思想對于相關(guān)的對象類型,直接實現(xiàn)他們各自的定義,不需要共有基類,甚至可以沒任何關(guān)系, 只需要各個具體類的實現(xiàn)中要求相同的接口聲明,這里的接口稱之為隱式接口。客戶端把操作這些對象的函數(shù)定義為模板,當需要操作什么類型的對象時,直接對模板指定該類型實參即可(或通過實參演繹獲得)

在模板編程及泛型編程中,是以隱式接口和編譯器多態(tài)來實現(xiàn)靜態(tài)多態(tài)。

代碼如下:

class Circle {
public:
    void Draw() const{
        cout << "Circle draw" << endl;
    }
    int z;
};
class Rectangle {
public:
    void Draw() const{
        cout << "Rectangle draw" << endl;
    }
};
template<typename T>
void test(const T& t) {
    t.Draw();
}
void extendsTest::mainTest()
{   
    //cout << func().real << endl;
    Circle cir;
    test(cir);
    Rectangle rec;
    test(rec);
};

打印結(jié)果:
Circle draw
Rectangle draw

靜態(tài)多態(tài)本質(zhì)上就是模板的具現(xiàn)化, 靜態(tài)多態(tài)中的接口調(diào)用也叫做隱式接口 ,相對于顯示接口由函數(shù)的簽名式(也就是函數(shù)名稱、參數(shù)類型、返回類型)構(gòu)成,隱式接口通常由有效表達式組成

動態(tài)多態(tài)

動態(tài)多態(tài)核心思想對于相關(guān)的對象類型,確定它們之間的一個共同功能集,然后在基類中, 把這些共同的功能聲明為多個公共的虛函數(shù)接口。各個子類重寫這些虛函數(shù), 以完成具體的功能。客戶端的代碼(操作函數(shù))通過指向基類的引用或指針來操作這些對象, 對虛函數(shù)的調(diào)用會自動綁定到實際提供的子類對象上去。

動態(tài)多態(tài)是在運行期完成的,這造就了動態(tài)多態(tài)機制在處理異質(zhì)對象集合時的強大威力(當然,也有了一點點性能損失)。

如下代碼:

class Geometry {
public:
    virtual void Draw() const=0;
};
class Circle :public Geometry{
public:
    void Draw() const{
        cout << "Circle draw" << endl;
    }
    int z;
};
class Rectangle :public Geometry {
public:
    void Draw() const{
        cout << "Rectangle draw" << endl;
    }
};
void extendsTest::mainTest()
{   
    Circle cir;
    const Geometry* e1 = ○
    e1->Draw();
    Rectangle rec;
    const Geometry* e2 = &rec;
    e2->Draw();

};
打印結(jié)果:
Circle draw
Rectangle draw

//動態(tài)多態(tài)最吸引人之處在于處理異質(zhì)對象集合的能力

void DrawVec(std::vector
    {
        const size_t size = vecGeo.size();
        for(size_t i = 0; i < size; ++i)
            vecGeo[i]->Draw();
    }
}

動態(tài)多態(tài)本質(zhì)上就是面向?qū)ο笤O(shè)計中的繼承、多態(tài)的概念。動態(tài)多態(tài)中的接口是顯式接口(虛函數(shù))

動態(tài)多態(tài)構(gòu)成條件

  • 1.必須通過基類的指針或者引用調(diào)用虛函數(shù)。
  • 2.被調(diào)用的函數(shù)必須是虛函數(shù),且子類必須對父類的虛函數(shù)進行重寫。

動態(tài)多態(tài)實現(xiàn)原理:虛函數(shù)表

class Geometry {
public:
    virtual void Draw() const=0;
};
class Circle :public Geometry{
public:
    void Draw() const{
        cout << "Circle draw" << endl;
    }
    int z;
};
class Rectangle :public Geometry {
public:
    void Draw() const{
        cout << "Rectangle draw" << endl;
    }
};
void extendsTest::mainTest()
{   
    Circle cir;
    const Geometry* e1 = ○
    e1->Draw();

};

Circle對象中除了z成員變量外,實際上還有一個指針_vfptr放在對象的前面(有些平臺可能會放到對象的最后面,這個跟平臺有關(guān)).

圖片

對象中的這個指針叫做虛函數(shù)表指針,簡稱虛表指針,虛表指針指向一個虛函數(shù)表,簡稱虛表,每一個含有虛函數(shù)的類中都至少有一個虛表指針。

#include 
using namespace std;
//父類
class Base
{
public:
    //虛函數(shù)
    virtual void Func1()
    {
        cout << "Base::Func1()" << endl;
    }
    //虛函數(shù)
    virtual void Func2()
    {
        cout << "Base::Func2()" << endl;
    }
    //普通成員函數(shù)
    void Func3()
    {
        cout << "Base::Func3()" << endl;
    }
private:
    int _b = 1;
};
//子類
class Derive : public Base
{
public:
    //重寫虛函數(shù)Func1
    virtual void Func1()
    {
        cout << "Derive::Func1()" << endl;
    }
private:
    int _d = 2;
};
int main()
{
    Base b;
    Derive d;
    return 0;
}

圖片

虛表當中存儲的就是虛函數(shù)的地址,因為父類當中的Func1和Func2都是虛函數(shù),所以父類對象b的虛表當中存儲的就是虛函數(shù)Func1和Func2的地址。而子類雖然繼承了父類的虛函數(shù)Func1和Func2,但是子類對父類的虛函數(shù)Func1進行了重寫,因此,子類對象d的虛表當中存儲的是父類的虛函數(shù)Func2的地址和重寫的Func1的地址。

這就是為什么虛函數(shù)的重寫也叫做覆蓋,覆蓋就是指虛表中虛函數(shù)地址的覆蓋,重寫是語法的叫法,覆蓋是原理層的叫法。

虛函數(shù)表本質(zhì)是一個存虛函數(shù)指針的指針數(shù)組,一般情況下會在這個數(shù)組最后放一個nullptr。

當滿足多態(tài)條件以后,父類的指針或引用調(diào)用虛函數(shù)時,不是編譯時確定的,而是運行時到指向的對象中的虛表中去找對應(yīng)的虛函數(shù)調(diào)用,并且引用的底層也是由指針實現(xiàn),父類在指向子類時會發(fā)生切片。 所以指針指向父類的對象,調(diào)用的就是父類的虛函數(shù),指向的是子類對象,調(diào)用的就是子類的虛函數(shù)。

動態(tài)多態(tài)和靜態(tài)多態(tài)的比較

靜態(tài)多態(tài)優(yōu)點:

靜態(tài)多態(tài)是在編譯期完成,因此效率高,編譯器可以進行優(yōu)化。 有很強的是適配性和松耦合性。 最重要一點 通過模板編程為C++帶來了泛型設(shè)計的概念 ,比如強大的STL庫

靜態(tài)多態(tài)缺點:

由于是模板來實現(xiàn)靜態(tài)多態(tài),因此 模板的不足也就是靜多態(tài)的劣勢 ,比如調(diào)試困難、編譯耗時、代碼膨脹、編譯器支持的兼容性,不能夠處理異質(zhì)對象集合。

動態(tài)多態(tài)優(yōu)點:

OO設(shè)計,對是客觀世界的直覺認識;

實現(xiàn)與接口分離,可復(fù)用;

處理同一繼承體系下異質(zhì)對象集合的強大威力

動態(tài)多態(tài)缺點:

運行期綁定,導(dǎo)致一定程度的運行時開銷

編譯器無法對虛函數(shù)進行優(yōu)化;

笨重的類繼承體系,對接口的修改影響整個類層次;

不同點:

本質(zhì)不同,靜態(tài)多態(tài)在編譯期決定,由模板具現(xiàn)完成,而動態(tài)多態(tài)在運行期決定,由繼承、虛函數(shù)實現(xiàn);

動態(tài)多態(tài)中接口是顯式的,以函數(shù)簽名為中心,多態(tài)通過虛函數(shù)在運行期實現(xiàn),靜態(tài)多臺中接口是隱式的,以有效表達式為中心,多態(tài)通過模板具現(xiàn)在編譯期完成。

相同點:

都能夠?qū)崿F(xiàn)多態(tài)性,靜態(tài)多態(tài)/編譯期多態(tài)、動態(tài)多態(tài)/運行期多態(tài);

都能夠使接口和實現(xiàn)相分離,一個是模板定義接口,類型參數(shù)定義實現(xiàn),一個是基類虛函數(shù)定義接口,繼承類負責實現(xiàn);

總結(jié)

本篇文章詳解講解了C++中的面向?qū)ο缶幊痰娜筇匦裕?strong>封裝,繼承以及多態(tài) 以及對象編程中模板編程,虛函數(shù),構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造,操作符重載等知識 , 知識點還是比較多的,需要好好消化下。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    Labview 之面向對象編程。 里面有個例子 和視頻教程地址

    Labview 之面向對象編程。 里面有個例子 和視頻教程地址Labview 之面向對象編程
    發(fā)表于 12-29 10:16

    C++ 面向對象多線程編程下載

    C++ 面向對象多線程編程下載
    發(fā)表于 04-08 02:14 ?70次下載

    C++面向對象多線程編程 (pdf電子版)

    C++面向對象多線程編程共分13章,全面講解構(gòu)建多線程架構(gòu)與增量多線程編程技術(shù)。第1章介紹了
    發(fā)表于 09-25 09:39 ?0次下載

    C++課件

     C++面向對象程序設(shè)計 面向對象思想的由來面向
    發(fā)表于 04-10 13:41 ?0次下載

    Visual C++面向對象與可視化程序設(shè)計習題解析與編程

    Visual C++面向對象與可視化程序設(shè)計習題解析與編程實例從最基本的概念出發(fā),詳細地講述了使用Visual C++進行
    發(fā)表于 07-12 15:16 ?0次下載
    Visual <b class='flag-5'>C++</b><b class='flag-5'>面向</b><b class='flag-5'>對象</b>與可視化程序設(shè)計習題解析與<b class='flag-5'>編程</b>實

    C++編程思想

    C++編程思想,很好的資料,大家下載看看吧!夠20字了吧,哈哈哈!
    發(fā)表于 11-17 11:38 ?0次下載

    面向對象的程序設(shè)計(C++

    面向對象的程序設(shè)計(C++).面向對象的基本思想 C++
    發(fā)表于 03-22 14:40 ?0次下載

    C#入門教程之面向對象編程簡介的詳細資料概述

    本文檔的主要內(nèi)容詳細介紹的是C#入門教程之面向對象編程簡介的詳細資料概述主要學(xué)習的目標是1.面向對象
    發(fā)表于 12-05 11:54 ?35次下載
    <b class='flag-5'>C</b>#入門教程<b class='flag-5'>之面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b>簡介的詳細資料概述

    C++語言和面向對象程序設(shè)計教程

    章至第11章介紹符合C++國際標準的C++面向對象程序設(shè)計思想和方法;第12章和第13章分別介紹面向
    發(fā)表于 03-02 08:00 ?6次下載

    STM32 C++編程系列二:STM32 C++代碼封裝初探

    一、STM32與面向對象編程上一章中提到了,C++的核心之一就在于面向對象
    發(fā)表于 12-08 11:06 ?13次下載
    STM32 <b class='flag-5'>C++</b><b class='flag-5'>編程</b>系列二:STM32 <b class='flag-5'>C++</b>代碼封裝初探

    嵌入式C語言面向對象編程應(yīng)用及優(yōu)勢

    既然面向對象是一種編程思想,而編程語言只是一種工具,那么,思想與工具之間就不存在一種強耦合的關(guān)系
    發(fā)表于 11-10 12:00 ?2074次閱讀
    嵌入式<b class='flag-5'>C</b>語言<b class='flag-5'>面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b>應(yīng)用及優(yōu)勢

    C語言是怎么面向對象編程

    在嵌入式開發(fā)中,C/C++語言是使用最普及的,在C++11版本之前,它們的語法是比較相似的,只不過C++提供了面向
    的頭像 發(fā)表于 02-14 13:57 ?2024次閱讀
    <b class='flag-5'>C</b>語言是怎么<b class='flag-5'>面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b>

    C/C++之面向對象編程思想1

    C++作為一門在C和Java之間的語言,其既可以使用C語言中的高效指針,又繼承了Java中的面向對象編程
    的頭像 發(fā)表于 03-30 15:14 ?833次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>之面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b><b class='flag-5'>思想</b>1

    C/C++之面向對象編程思想2

    C++作為一門在C和Java之間的語言,其既可以使用C語言中的高效指針,又繼承了Java中的面向對象編程
    的頭像 發(fā)表于 03-30 15:14 ?771次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>之面向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b><b class='flag-5'>思想</b>2

    淺談C語言面向對象編程思想

    C語言是一種面向過程的語言,但是也可以用結(jié)構(gòu)體和函數(shù)指針來模擬面向對象的特性,比如封裝、繼承和多態(tài)。
    發(fā)表于 11-02 12:27 ?1478次閱讀
    主站蜘蛛池模板: 性欧美www | 四虎影音在线观看 | 天天干夜操 | 久久大综合 | 亚洲人成亚洲人成在线观看 | 依依成人精品无v国产 | 国产精品久久久久久久久ktv | 久久aa毛片免费播放嗯啊 | 色香蕉在线观看网站 | 你懂的在线观看视频 | 超级乱淫伦网站 | 屁屁影院在线 | 天天摸天天做 | 午夜影院观看 | 六月丁香婷婷天天在线 | 午夜操操操 | fc2 ppv sss级素人美女 | 四虎一区二区三区精品 | 毛片大全免费 | 狠狠色视频 | 伊人亚洲综合网成人 | 国产精品资源在线观看 | 4虎成人| 久久免费观看国产精品 | 国产一级特黄高清免费大片 | 久久国产精品自在自线 | 免费网站日本永久免费观看 | 天天做天天爱天天做天天吃中 | 国产高清不卡一区二区 | 中文字幕二区 | 一级做受毛片免费大片 | 欧美另类69 | brazzersvideosex欧美高清 | 男人和女人做爽爽视频在线观看 | 亚洲综合激情另类专区 | 性感美女逼 | 人人插人人射 | 成年午夜一级毛片视频 | 久久99色 | 国产中文99视频在线观看 | 黄色在线观看网址 |