亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ 中構造函數的實例詳解

2020-05-23 13:37:50
字體:
來源:轉載
供稿:網友

C++構造函數的實例詳解

c++構造函數的知識在各種c++教材上已有介紹,不過初學者往往不太注意觀察和總結其中各種構造函數的特點和用法,故在此我根據自己的c++編程經驗總結了一下c++中各種構造函數的特點,并附上例子,希望對初學者有所幫助。

1. 構造函數是干什么的

 

class Counter{ public:  // 類Counter的構造函數  // 特點:以類名作為函數名,無返回類型  Counter()  {    m_value = 0;  }     private:     // 數據成員 int m_value;}

該類對象被創建時,編譯系統對象分配內存空間,并自動調用該構造函數->由構造函數完成成員的初始化工作

eg: Counter c1;       

編譯系統為對象c1的每個數據成員(m_value)分配內存空間,并調用構造函數Counter()自動地初始化對象c1的m_value值設置為0

故:構造函數的作用:初始化對象的數據成員。

2. 構造函數的種類

class Complex {      private :  double m_real;  double m_imag; public:   // 無參數構造函數  // 如果創建一個類你沒有寫任何構造函數,則系統會自動生成默認的無參構造函數,函數為空,什么都不做  // 只要你寫了一個下面的某一種構造函數,系統就不會再自動生成這樣一個默認的構造函數,如果希望有一個這樣的無參構造函數,則需要自己顯示地寫出來  Complex(void)  {     m_real = 0.0;     m_imag = 0.0;  }        // 一般構造函數(也稱重載構造函數)  // 一般構造函數可以有各種參數形式,一個類可以有多個一般構造函數,前提是參數的個數或者類型不同(基于c++的重載函數原理)  // 例如:你還可以寫一個 Complex( int num)的構造函數出來  // 創建對象時根據傳入的參數不同調用不同的構造函數  Complex(double real, double imag)  {     m_real = real;     m_imag = imag;        }     // 復制構造函數(也稱為拷貝構造函數)  // 復制構造函數參數為類對象本身的引用,用于根據一個已存在的對象復制出一個新的該類的對象,一般在函數中會將已存在對象的數據成員的值復制一份到新創建的對象中  // 若沒有顯示的寫復制構造函數,則系統會默認創建一個復制構造函數,但當類中有指針成員時,由系統默認創建該復制構造函數會存在風險,具體原因請查詢有關 “淺拷貝” 、“深拷貝”的文章論述  Complex(const Complex & c)  {    // 將對象c中的數據成員值復制過來    m_real = c.m_real;    m_img = c.m_img;  }         // 類型轉換構造函數,根據一個指定的類型的對象創建一個本類的對象  // 例如:下面將根據一個double類型的對象創建了一個Complex對象  Complex::Complex(double r)  {    m_real = r;    m_imag = 0.0;  }   // 等號運算符重載  // 注意,這個類似復制構造函數,將=右邊的本類對象的值復制給等號左邊的對象,它不屬于構造函數,等號左右兩邊的對象必須已經被創建  // 若沒有顯示的寫=運算符重載,則系統也會創建一個默認的=運算符重載,只做一些基本的拷貝工作  Complex &operator=(const Complex &rhs)  {    // 首先檢測等號右邊的是否就是左邊的對象本,若是本對象本身,則直接返回    if ( this == &rhs )     {      return *this;    }           // 復制等號右邊的成員到左邊的對象中    this->m_real = rhs.m_real;    this->m_imag = rhs.m_imag;           // 把等號左邊的對象再次傳出    // 目的是為了支持連等 eg:  a=b=c 系統首先運行 b=c    // 然后運行 a= ( b=c的返回值,這里應該是復制c值后的b對象)      return *this;  }};

下面使用上面定義的類對象來說明各個構造函數的用法:

void main(){  // 調用了無參構造函數,數據成員初值被賦為0.0  Complex c1,c2;   // 調用一般構造函數,數據成員初值被賦為指定值  Complex c3(1.0,2.5);  // 也可以使用下面的形式  Complex c3 = Complex(1.0,2.5);       // 把c3的數據成員的值賦值給c1  // 由于c1已經事先被創建,故此處不會調用任何構造函數  // 只會調用 = 號運算符重載函數  c1 = c3;       // 調用類型轉換構造函數  // 系統首先調用類型轉換構造函數,將5.2創建為一個本類的臨時對象,然后調用等號運算符重載,將該臨時對象賦值給c1  c2 = 5.2;      // 調用拷貝構造函數( 有下面兩種調用方式)   Complex c5(c2);  Complex c4 = c2; // 注意和 = 運算符重載區分,這里等號左邊的對象不是事先已經創建,故需要調用拷貝構造函數,參數為c2         }

3. 思考與測驗

(1) 為什么函數中可以直接訪問對象c的私有成員 ?

Complex(const Complex & c){  // 將對象c中的數據成員值復制過來  m_real = c.m_real;  m_img = c.m_img;}

(2) 挑戰題,了解引用與傳值的區別

Complex test1(const Complex& c){  return c;}  Complex test2(const Complex c){  return c;}  Complex test3(){  static Complex c(1.0,5.0);  return c;}  Complex& test4(){  static Complex c(1.0,5.0);  return c;}  void main(){  Complex a,b;    // 下面函數執行過程中各會調用幾次構造函數,調用的是什么構造函數?     test1(a);  test2(a);     b = test3();  b = test4();     test2(1.2);     // 下面這條語句會出錯嗎?  test1(1.2);        //test1( Complex(1.2 )) 呢?}

4. 淺拷貝與深拷貝

上面提到,如果沒有自定義復制構造函數,則系統會創建默認的復制構造函數,但系統創建的默認復制構造函數只會執行“淺拷貝”,即將被拷貝對象的數據成員的值一一賦值給新創建的對象,若該類的數據成員中有指針成員,則會使得新的對象的指針所指向的地址與被拷貝對象的指針所指向的地址相同,delete該指針時則會導致兩次重復delete而出錯。下面是示例:

#include <iostream.h>#include <string.h>class Person {public :       // 構造函數  Person(char * pN)  {    cout << "一般構造函數被調用 !/n";    m_pName = new char[strlen(pN) + 1];    //在堆中開辟一個內存塊存放pN所指的字符串    if(m_pName != NULL)     {      //如果m_pName不是空指針,則把形參指針pN所指的字符串復制給它       strcpy(m_pName ,pN);    }  }          // 系統創建的默認復制構造函數,只做位模式拷貝  Person(Person & p)    {     //使兩個字符串指針指向同一地址位置         m_pName = p.m_pName;       }   ~Person( )  {    delete m_pName;  }     private :  char * m_pName;}; void main( ){   Person man("lujun");  Person woman(man);      // 結果導致  man 和  woman 的指針都指向了同一個地址     // 函數結束析構時  // 同一個地址被delete兩次}  // 下面自己設計復制構造函數,實現“深拷貝”,即不讓指針指向同一地址,而是重新申請一塊內存給新的對象的指針數據成員Person(Person & chs);{   // 用運算符new為新對象的指針數據成員分配空間   m_pName=new char[strlen(p.m_pName)+ 1];    if(m_pName)        {       // 復制內容      strcpy(m_pName ,chs.m_pName);   }    // 則新創建的對象的m_pName與原對象chs的m_pName不再指向同一地址了}

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美人交a欧美精品| 中文字幕亚洲天堂| 欧美日韩国产麻豆| 久久久亚洲天堂| 亚洲一区美女视频在线观看免费| 国产一区二区丝袜高跟鞋图片| 亚洲天堂成人在线| 国产精品免费视频xxxx| 色999日韩欧美国产| 亚洲尤物视频网| 亚洲午夜精品久久久久久久久久久久| 亚洲第一男人av| 久久成人人人人精品欧| 欧美亚洲视频一区二区| 在线观看国产成人av片| 国产精品永久免费在线| 亚洲美女在线观看| 91在线免费视频| 91精品视频在线播放| 在线观看精品自拍私拍| 日韩av片电影专区| 日韩欧美在线视频日韩欧美在线视频| 亚洲四色影视在线观看| 久久久久国产精品免费网站| 国产成人精品免费视频| 午夜精品久久久久久久男人的天堂| 国产精品91视频| 2021久久精品国产99国产精品| 国产日韩欧美在线视频观看| 亚洲成人在线视频播放| 91久久久亚洲精品| 欧美资源在线观看| 欧美性猛交视频| 色与欲影视天天看综合网| 国产97免费视| 欧美日韩免费在线| 亚洲视频日韩精品| 国产精品午夜视频| 欧美劲爆第一页| 久久精品99久久久久久久久| 精品福利在线视频| 欧美性猛交丰臀xxxxx网站| 日韩高清中文字幕| 91大神在线播放精品| 日本午夜精品理论片a级appf发布| 97在线视频国产| 国产91精品最新在线播放| 亚洲激情免费观看| 精品无人区太爽高潮在线播放| 中文字幕精品www乱入免费视频| 国产一区二区三区视频| 欧美日韩午夜激情| 久操成人在线视频| 欧美精品videos性欧美| 色香阁99久久精品久久久| 欧美有码在线观看视频| 亚洲欧美中文另类| 日韩在线观看你懂的| 亚洲欧美国产高清va在线播| 国产成人拍精品视频午夜网站| 欧美乱妇40p| 久久av在线看| 国产丝袜一区二区三区| 97在线免费视频| 欧美猛交免费看| 国产精品久久久久久久天堂| 九九精品视频在线| 668精品在线视频| 欧美高清电影在线看| 亚洲国产精品va在线观看黑人| 国产成人久久久| 97香蕉久久夜色精品国产| 精品久久久免费| 国产精品视频男人的天堂| xxxxx91麻豆| www日韩中文字幕在线看| 国产精品一区二区在线| 成人黄色av免费在线观看| 国产精品91久久久久久| 国内精品久久久久久久| 亚洲一区二区三区777| 亚洲国产福利在线| 欧美视频免费在线观看| 韩曰欧美视频免费观看| 久久久国产精品x99av| 中文.日本.精品| 欧美日韩国产综合视频在线观看中文| 欧美日韩裸体免费视频| 黑人巨大精品欧美一区二区三区| 成人黄色在线播放| 国产精品一区专区欧美日韩| 亚洲视频网站在线观看| 91精品一区二区| 久久免费少妇高潮久久精品99| 欧美成人精品一区二区三区| 色偷偷亚洲男人天堂| 在线观看视频99| 91免费国产视频| 成人免费网站在线看| 国产精品久久久久久久7电影| 亚洲人成在线观看| 国产精品久久久久久久久久小说| 日韩av电影免费观看高清| 日韩视频在线免费观看| 中文字幕av一区二区三区谷原希美| 日韩欧美主播在线| 成人a级免费视频| 日韩国产在线播放| 亚洲日本欧美中文幕| 亚洲福利视频二区| 久久91精品国产91久久久| 日韩精品一区二区视频| 国模视频一区二区三区| 中文字幕日韩在线播放| 国产福利精品av综合导导航| 中文字幕日韩精品有码视频| 日韩免费观看在线观看| 亚洲精品小视频| 国产一区二区三区精品久久久| 欧美成人精品不卡视频在线观看| 欧美性猛交xxxxx水多| 日韩av在线免费观看一区| 92裸体在线视频网站| 欧美刺激性大交免费视频| 亚洲国产精品悠悠久久琪琪| 成人有码在线播放| 亚洲黄色av女优在线观看| 97精品国产aⅴ7777| 欧美一级片在线播放| 国产一区二区三区毛片| 国产欧洲精品视频| 日本高清不卡在线| 4444欧美成人kkkk| 欧美日韩中文在线观看| 亚洲免费伊人电影在线观看av| 国产不卡在线观看| 欧美亚洲国产精品| 欧美成人精品h版在线观看| 国产成人精品电影| 亚洲高清在线观看| 最近2019好看的中文字幕免费| 亚洲精品国精品久久99热一| 久久韩剧网电视剧| 日韩毛片在线看| 欧美黑人国产人伦爽爽爽| 欧美日韩中文在线观看| 国产成人精品电影久久久| 亚洲国产精品悠悠久久琪琪| 久久亚洲精品网站| 欧美成人免费大片| 欧美黑人巨大xxx极品| 国产成人av在线| 97**国产露脸精品国产| 亚洲国产日韩欧美在线图片| 97国产成人精品视频| 精品视频在线观看日韩| 97精品国产97久久久久久春色| 国产精品视频区| 亚洲人成77777在线观看网| 亚洲深夜福利网站| 国产成人亚洲综合青青| 欧美一区二区三区艳史| 久久久久久欧美| 亚洲国产美女精品久久久久∴|