91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

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

jf_78858299 ? 來源:小余的自習室 ? 作者:小余的自習室 ? 2023-03-30 15:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C++中的幾種特殊成員函數(shù)

構(gòu)造函數(shù)

C++在編譯器會給我們默認創(chuàng)建一個缺省的構(gòu)造方法: 如下代碼:

class Father {
public:
    string name = "father";
    int age = 45;
    void print() {
        cout << "name:" << name << " age:" << age << endl;
    }
};
class Son :public Father {
public:
    string sex = "male";
};

void extendsTest::mainTest()
{
    Son son;
    son.print();
};
運行結(jié)果:name:father age:45

可以看到雖然我們沒有明確聲明構(gòu)造方法,但是依然可以調(diào)用無參構(gòu)造方法。這就是因為 編譯器自動給我們創(chuàng)建了一個無參構(gòu)造方法

如果類定義了自己的構(gòu)造方法后(包括無參和有殘),編譯器就不會給我們創(chuàng)建了 ,看下面代碼:

class Father {
public:
    Father() {
        cout << "Father:" << name << endl;
    }
    string name = "father";
    int age = 45;
    void print() {
        cout << "name:" << name << " age:" << age << endl;
    }
};
class Son :public Father {
public:
    Son(){
        cout << "Son:" << name << endl;
    }
    string sex = "male";    
};

void extendsTest::mainTest()
{
    Son son;
    son.print();
};
打印結(jié)果:
Father:father
Son:father
name:father age:45

從上面代碼也可以看出C++編譯器會默認優(yōu)先調(diào)用父類的構(gòu)造方法,再調(diào)用子類的構(gòu)造方法,

這點和java中是有區(qū)別的,java會從子類開始依次調(diào)用父類的構(gòu)造方法,然后回溯子類的構(gòu)造方法

所以為了保證對象的順利創(chuàng)建,需要保證父類的構(gòu)造方法是有效的。 如下代碼:

class Father {
public:
    Father(string _name):name(_name){
        cout << "Father:" << name << endl;
    }
    string name = "father";
    int age = 45;
};

此時父類中創(chuàng)建了一個有參構(gòu)造方法,前面說過,此時編譯器不會創(chuàng)建默認的無參構(gòu)造方法,則需要保證在其子類中有初始化父類的操作:即調(diào)用父類有參構(gòu)造方法。 如下代碼:

class Son :public Father {
public:
    Son(string name):Father(name) {
        cout << "Son:" << name << endl;
    }
    string sex = "male";
};

void extendsTest::mainTest()
{
    Son son1("myName");
};
結(jié)果:
Father:myName
Son:myName

析構(gòu)函數(shù)

析構(gòu)函數(shù)用來釋放當前對象使用到的內(nèi)存空間,當對象跳出其作用域范圍后就會執(zhí)行析構(gòu)函數(shù)( 除非是有智能指針出現(xiàn)循環(huán)引用的情況,無法釋放,導致泄露 )。 C++中析構(gòu)函數(shù)和構(gòu)造函數(shù)相反,會 優(yōu)先調(diào)用子類的析構(gòu)函數(shù)再調(diào)用父類的析構(gòu)函數(shù) 。 如下代碼:

class Father {
public:
    ~Father() {
        cout << "~Father"<< endl;
    }
    string name = "father";
    int age = 45;

};
class Son :public Father {
public:
    ~Son() {
        cout << "~Son" << endl;
    }   
    string sex = "male";    
};

void extendsTest::mainTest()
{
    Son son;
};
運行結(jié)果:
~Son
~Father

拷貝構(gòu)造

C++中拷貝構(gòu)造函數(shù)格式:

  • 格式1 :帶const參數(shù) Complex(const Complex& c) { … } 表示以常量對象作為參數(shù)
  • 格式2 :不帶const參數(shù) Complex(Complex& c) { … } 表示以非常量作為參數(shù)進行拷貝 如下代碼:
class Complex {
  public:
    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(Complex& c) {
        real = c.real+1; imag = c.imag+1;
    }
  };

void extendsTest::mainTest()
{
    Complex c1(1.0, 2.0);
    Complex c2(c1);
    c2.print();
};
打印結(jié)果:
real:1 imag:2
real:2 imag:3

拷貝構(gòu)造函數(shù)和構(gòu)造方法類似, C++編譯器會給我們提供默認的拷貝構(gòu)造函數(shù) 。 將上面代碼的拷貝構(gòu)造函數(shù)刪除后:

class Complex {
public:
    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;
    }
};

void extendsTest::mainTest()
{
    Complex c1(1.0, 2.0);
    Complex c2(c1);
    c2.print();
};

依然可以執(zhí)行拷貝構(gòu)造,此時c2使用了默認拷貝構(gòu)造函數(shù)進行賦值。

拷貝構(gòu)造的幾種調(diào)用形式:

  • 1.當用一個對象去初始化同類的另一個對象時

    Complex c2(c1);
    Complex c2 = c1;
    

    這兩天語句是等價的。但是要 注意此時Complex c2 = c1是一個初始化語句,并非一個賦值語句。賦值語句是一個已經(jīng)初始化后的變量 。 如下:

    Complex c1, c2; c1 = c2 ;
    c1=c2;
    

    賦值語句不會觸發(fā)拷貝構(gòu)造

  • 2.當對象作為一個函數(shù)形參時,此時也會觸發(fā)對象的拷貝構(gòu)造

    class Complex {
      public:
        double real, imag;
        Complex(double _real, double _imag):
            real(_real),imag(_imag)
        {
            cout << "real:" << real << " imag:" << imag << endl;
        }
        Complex(Complex& c) {
            real = c.real+1; imag = c.imag+1;
            cout << "complex copy" << endl;
        }
      };
    
    void func(Complex c) {
        cout << "real:" << c.real << " imag:" << c.imag << endl;
    
    }
    
    void extendsTest::mainTest()
    {   
        Complex c(1.0,2.0);
        func(c);
    };
    
    運行結(jié)果:
    real:1 imag:2
    complex copy
    real:2 imag:3
    

    可以看到運行結(jié)果觸發(fā)了Complex的拷貝構(gòu)造 以對象作為函數(shù)的形參,在函數(shù)被調(diào)用時,生成的形參要用復制構(gòu)造函數(shù)初始化,這會帶來時間上的開銷。 如果用對象的引用而不是對象作為形參,就沒有這個問題了

    void func(Complex& c) {
        cout << "real:" << c.real << " imag:" << c.imag << endl;
    }
    

    但是以引用作為形參有一定的風險,因為這種情況下如果形參的值發(fā)生改變,實參的值也會跟著改變。 最好的方法就是將函數(shù)形參聲明為const類型的引用

    void func(const Complex& c) {
        cout << "real:" << c.real << " imag:" << c.imag << endl;
    }
    
  • 3.對象作為函數(shù)返回值返回時,也會觸發(fā)拷貝構(gòu)造。

    Complex func() {
        Complex c(1.0, 2.0);
        return c;
      }
      void extendsTest::mainTest()
      { 
        cout << func().real << endl;
      };
    
    結(jié)果:
    real:1 imag:2
    complex copy
    2
    

    可以看到此時func函數(shù)中的return c處會觸發(fā)一次拷貝構(gòu)造,并將拷貝后的對象返回。 這點通過函數(shù)hack過程也可以看出來:此處call方法執(zhí)行的是拷貝構(gòu)造方法

    圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(liá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)與增量多線程編程技術。第1章介紹了
    發(fā)表于 09-25 09:39 ?0次下載

    C++課件

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

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

    Visual C++面向對象與可視化程序設計習題解析與編程實例從最基本的概念出發(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>與可視化程序設計習題解析與<b class='flag-5'>編程</b>實

    C++編程思想

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

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

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

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

    本文檔的主要內(nèi)容詳細介紹的是C#入門教程之面向對象編程簡介的詳細資料概述主要學習的目標是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++語言和面向對象程序設計教程

    章至第11章介紹符合C++國際標準的C++面向對象程序設計思想和方法;第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ōu)勢

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

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

    在嵌入式開發(fā)中,C/C++語言是使用最普及的,在C++11版本之前,它們的語法是比較相似的,只不過C++提供了面向
    的頭像 發(fā)表于 02-14 13:57 ?2135次閱讀
    <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 ?877次閱讀
    <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++之面向對象編程思想3

    C++作為一門在C和Java之間的語言,其既可以使用C語言中的高效指針,又繼承了Java中的面向對象編程
    的頭像 發(fā)表于 03-30 15:16 ?808次閱讀
    <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>3

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

    C語言是一種面向過程的語言,但是也可以用結(jié)構(gòu)體和函數(shù)指針來模擬面向對象的特性,比如封裝、繼承和多態(tài)。
    發(fā)表于 11-02 12:27 ?1556次閱讀
    主站蜘蛛池模板: 国产理论 | 一级片视频播放 | 午夜伦y4480影院中文字幕 | 成人在线亚洲 | 狼色视频在线观免费观看 | 天天综合亚洲国产色 | 天天操天天舔 | 欧美一区二区三区四区视频 | 伊人网网 | 国产精品嫩草影院一二三区入口 | 黄色在线观看视频网站 | 天天干天天色天天干 | 国产 日韩 欧美 高清 | 午夜免费观看_视频在线观看 | 黄色福利小视频 | 最新仑乱免费视频 | 99九九成人免费视频精品 | 欧美三级午夜伦理片 | 丁香啪啪天堂激情婷婷 | 日韩一级免费视频 | 亚洲综合激情丁香六月 | 精品色 | 中国一级做a爰片久久毛片 中韩日欧美电影免费看 | 中文在线三级中文字幕 | 秋霞一级特黄真人毛片 | 欧美伊人 | 大量真实偷拍情侣视频野战 | 日本大片网 | 欧美午夜场| 日日操夜夜 | 你懂的网站在线 | 美女黄视频免费 | 欧美一级免费在线观看 | 日日操夜夜操天天操 | www亚洲欲色成人久久精品 | 青草青青视频 | www.四虎.com| 无码一区二区三区视频 | 最近2018年中文字幕免费图片 | 最近最新中文字幕6页 | 亚洲国产精品综合久久久 |