日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 复制控制之复制构造函数

發布時間:2024/1/17 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 复制控制之复制构造函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

7月26日更新:

  過了這么長的時間回過頭來看,發現文章中有幾個點說錯(用紅字標出):

  •   構造函數不是只有唯一一個參數,它也可以是多參數形式,其第二參數及后繼以一個默認值供應。
  •   不是沒有聲明復制控制函數時編譯器就一定會幫類聲明,需要滿足一定的條件。
  • ?

    《《=========================================================================》》

    ?

    C++類用三個特殊的成員函數:復制構造函數、賦值操作符和析構函數 來決定類對象之間的初始化或賦值時發生什么。所謂的“復制控制”即通過這三個成員函數控制對象復制的過程。本篇文章將介紹復制構造函數。

    • 復制構造函數

    復制構造函數是什么

    ?? 復制構造函數首先是一個構造函數,它同所有其他的構造函數一樣與類同名,沒有返回值。它有一個唯一的參數(錯誤),是該類類型的引用(一般將它聲明為const,源于用于賦值的對象一般不用改變它本身的值)。于是復制構造函數的原型為:

    class BOOK {    public:BOOK(const BOOK& rhs); //構造函數一BOOK(string &name,float price = 0):_bookName(name),_price(price){}; //構造函數二BOOK():_price(0),_bookName(""){}; //構造函數三

      private:    float _price ;    string _bookName;//.... };

    ?

    什么時候被調用

    ?? 復制構造函數在需要復制類對象的時候被調用,這些調用情況可以總結為:

  • 根據一個同類型的對象顯示或隱式地初始化一個對象。
  •     當定義一個新對象并用一個同類型的對象對它進行初始化的時候,將顯式使用復制構造函數,如:

    BOOK book1; BOOK book2(book1);

        當將該類型的對象傳遞給函數或從函數返回該類型的對象時,將隱式地調用復制構造函數。

  • 作為值傳遞的實參傳遞給一個函數。
  • 函數返回時復制一個對象。
  • 初始化順序容器中的元素。
  • ? ?如:

    vector<string> svec(5);

    ?

      編譯器首先調用string類默認構造函數創建一個臨時值,再用復制構造函數將臨時值復制到每一個元素。

  • 根據元素初始化列表初始化數組元素。
  •   如:

    BOOK books[]={string("book1"),string("book2"),string("book3"),BOOK() };

    ?

      book數組的前三個元素將調用構造函數二進行隱式類型轉換(C++隱式類型轉換),然后調用復制構造函數進行數組元素的復制。如果類禁止隱式類型轉換(構造函數使用了explicit聲明),或希望不指定實參或多個實參,需要使用完整的構造函數語法,如數組最后一個元素的初始化。

    ?

    如果沒有為類聲明復制構造函數會怎樣

    ????? 如果你沒有聲明一個復制構造函數,那么編譯器會給聲明一個。實際上,如果你自己沒有聲明,編譯器會為類聲明一個復制構造函數 ,一個賦值操作符以及一個析構函數,此外如果你沒有聲明任何構造函數的話,編譯器也會為你聲明一個合成默認構造函數。(錯誤)所有這些編譯器自動生成的類成員函數皆為pubilc inline。(這部分內容可以參考《Effective C++》條款05)編譯器創建的復制構造函數單純地將來源對象的每一個非static成員拷貝到目標對象,這在很多時候是不能滿足類需求的,特別是類中含有指針時,這時候就需要我們自己來寫復制控制的三個特殊成員函數了。

    ?

    編譯器合成的復制構造函數做了什么

      合成復制構造函數的行為是:對每一個非static成員進行逐個成員初始化。成員類型不同,初始化方式不一樣:

    內置類型(如int):直接復制值。

    類類型:調用該類的復制構造函數進行復制。

    數組:這個比較特殊,因為我們知道一般不能復制數組,但在類中,復制數組時合成復制構造函數將復制數組的每一個值。

    另外,合成復制構造函數對類數據成員的初始化都是放在構造函數初始化列表中進行的。

    ?

    禁止復制

    ?

    ????? 如果我們想禁止某個類的復制行為,我們當然不會想去定義一個復制構造函數,然而編譯器卻會自動為我們定義一個,那么到底該如何阻止一個類的復制行為呢?

    ????? 我們可以將復制構造函數定義為private,不允許用戶代碼復制該類類型的對象,若進行復制將在編譯時發生錯誤。然而類的友元和成員仍可以進行復制,解決辦法是我們可以聲明一個private復制構造函數卻不進行定義,類成員或友元進行復制嘗試時,將在程序運行時發生錯誤。

    總結:為駁回編譯器自動提供的機能,可將相應的成員函數聲明為private并且不予實現。(具體可參考《Effective C++》條款06 若不想使用編譯器自動生成的函數,就該明確拒絕)

    ?

    轉載于:https://www.cnblogs.com/QG-whz/p/4485574.html

    總結

    以上是生活随笔為你收集整理的C++ 复制控制之复制构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 午夜无遮挡| 国产三区在线播放 | 丁香啪啪 | 久久精品国产亚洲av嫖农村妇女 | 国产成人精品一区二区三区网站观看 | 久草网在线视频 | 欧美黄色片视频 | 伊人精品久久 | 新狠狠干 | 日韩有码av | 精品国产成人av | 国产精品手机在线 | 国产国拍精品亚洲 | 在线欧美亚洲 | 性欧美高清 | 久久极品 | 每日在线更新av | 亚洲人高潮女人毛茸茸 | 久青草影视| 影音先锋精品 | 亚洲免费观看高清完整版在线 | 日韩成人在线一区 | 97免费人妻无码视频 | 大又大粗又爽又黄少妇毛片 | 亚洲一区二区免费在线观看 | 国产综合精品视频 | 91av视频免费观看 | 亚洲天堂2018av | 日本在线视频一区二区三区 | 亚洲黄av| 日韩在线www | 亚洲精品一区二区三区中文字幕 | 人妻巨大乳hd免费看 | 国产一区二区视频网站 | 熟女少妇a性色生活片毛片 亚洲伊人成人网 | av无码精品一区二区三区 | 久久成人国产精品入口 | 中文亚洲欧美 | avtt一区| jjzz日本女人| 欧美精品卡一卡二 | 天天操天天弄 | 我会温柔一点的日剧 | 开心激情综合 | 亚洲亚洲人成综合网络 | 国产一区精品视频 | 日日弄天天弄美女bbbb | 国产av 一区二区三区 | 极品美女被c | 久久精品噜噜噜成人88aⅴ | 日本久久中文字幕 | 色屁屁www| 伊人avav| 91大尺度 | 中文字幕无码乱码人妻日韩精品 | 国产精品无码999 | 亚洲精品字幕 | 看毛片视频 | 91在线欧美| 国产精品入口 | 国产中文字幕在线播放 | 亚洲AV无码成人精品区明星换面 | 另类综合在线 | 少妇视频在线 | 国产精品7 | 中文字幕电影av | 色一情一乱一乱一区91av | 91国内在线 | 国产无套内射又大又猛又粗又爽 | 老司机成人网 | 欧美久久久久久又粗又大 | 无码人妻少妇色欲av一区二区 | 久久蜜桃精品 | 91亚洲国产 | 一级香蕉视频在线观看 | 国产图区| 亚洲国产看片 | 中文字幕一区二区三区四区视频 | 欧美日韩在线视频免费 | 超黄网站在线观看 | 娇小tube性极品娇小 | 免费色站 | 羞羞动态图 | 蜜桃久久av| 日本免费无人高清 | 国产精品高潮视频 | 男人午夜天堂 | 91精品久久久久久久 | 五月丁香久久婷婷 | 国产精品高潮呻吟AV无码 | 韩国成人免费视频 | 亚洲一区二区综合 | 亚洲欧美另类视频 | 中文字幕一二三四区 | av手机观看| 国产黄色免费在线观看 | 日本爽爽| 日产精品久久久久久久蜜臀 | 欧美永久精品 |