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

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

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

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

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
国产精品日韩电影| 国产精品美女在线观看| 久久久久久久一区二区三区| 亚洲欧洲高清在线| 久久久久久成人| 5252色成人免费视频| 国产丝袜一区二区三区免费视频| 成人伊人精品色xxxx视频| 成人激情电影一区二区| 成人性生交xxxxx网站| 国产91精品最新在线播放| 国产精品日韩在线播放| 国产精品成人久久久久| 最好看的2019年中文视频| 欧美大奶子在线| 日韩小视频网址| 91精品国产乱码久久久久久蜜臀| 亚洲xxxx视频| 国产91精品青草社区| 美女久久久久久久| 97在线视频精品| 亚洲日韩欧美视频一区| 97成人超碰免| 午夜精品一区二区三区在线| 91久久久久久久一区二区| 久久久久999| 亚洲电影av在线| 日韩av在线免费观看一区| 亚洲人在线观看| 欧美另类69精品久久久久9999| 日韩福利视频在线观看| 国产精品1区2区在线观看| 国产精品人成电影| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲美女av电影| 91影视免费在线观看| 欧美性感美女h网站在线观看免费| 成人写真视频福利网| 奇米一区二区三区四区久久| 亚洲精品免费网站| 欧美日韩亚洲一区二区| 一个色综合导航| 欧美一级片一区| 久久好看免费视频| 国产原创欧美精品| 亚洲精品日韩激情在线电影| 色偷偷av亚洲男人的天堂| 影音先锋欧美精品| 国产精品网站视频| 欧美猛男性生活免费| 久久精品国产99国产精品澳门| 日韩精品免费观看| 国产成人自拍视频在线观看| 亚洲黄页网在线观看| 91精品国产综合久久香蕉的用户体验| 国产精品第1页| 国产激情视频一区| 亚洲激情在线视频| 国产福利精品av综合导导航| 国产欧美 在线欧美| xvideos成人免费中文版| 亚洲女人天堂成人av在线| 国语自产精品视频在免费| 青青草国产精品一区二区| 欧美成人免费全部| 国产日韩在线观看av| 精品一区二区三区四区| 日韩午夜在线视频| 亚洲日本欧美日韩高观看| 亚洲天堂一区二区三区| 日韩在线中文字幕| 理论片在线不卡免费观看| 在线观看亚洲区| 日本久久精品视频| 色中色综合影院手机版在线观看| 国产成人精品视频在线| 欧美性资源免费| 精品久久久久久中文字幕一区奶水| 黑人巨大精品欧美一区二区免费| 992tv成人免费影院| 亚洲视频专区在线| 国产亚洲欧美日韩一区二区| 最近更新的2019中文字幕| 91日本视频在线| 色偷偷av一区二区三区| 亚洲精品色婷婷福利天堂| 日韩精品在线电影| 一个人看的www久久| 上原亚衣av一区二区三区| 欧美成人激情图片网| 久久久久www| 欧美性猛交99久久久久99按摩| 国产成人精品一区二区| 亚洲美腿欧美激情另类| 久久久女女女女999久久| 欧美大学生性色视频| 国产香蕉精品视频一区二区三区| 国产精品久久久久久av福利| 日韩av三级在线观看| 亚洲成人激情在线观看| 日韩亚洲欧美中文高清在线| 国产综合在线视频| 亚洲国产精品一区二区三区| 久久国产精彩视频| 久久色免费在线视频| 青青草99啪国产免费| 98精品国产自产在线观看| 69av视频在线播放| 亚洲大尺度美女在线| 自拍偷拍亚洲区| 日本伊人精品一区二区三区介绍| 久久久久久久久久久国产| 色久欧美在线视频观看| 91精品久久久久久| 国产精品视频专区| 97在线观看免费高清| 一本色道久久88综合亚洲精品ⅰ| 国产精品亚洲视频在线观看| 亚洲国产精彩中文乱码av在线播放| 91精品在线一区| 国产脚交av在线一区二区| 色av中文字幕一区| 久久在精品线影院精品国产| 综合久久五月天| 久久偷看各类女兵18女厕嘘嘘| 国产精品电影观看| 欧美一区深夜视频| 国产一区二区久久精品| 草民午夜欧美限制a级福利片| 在线观看久久av| 久久久久久久久久久久久久久久久久av| 亚洲精品天天看| 久久成人这里只有精品| 一区二区在线视频| 精品久久久久久久久中文字幕| 97成人精品区在线播放| 国产精品美腿一区在线看| 亚洲精品自拍偷拍| 国产精品免费视频xxxx| 精品久久久久久亚洲国产300| 日韩电视剧在线观看免费网站| 亚洲精品电影网| 欧美亚洲国产精品| 午夜免费日韩视频| 国产精品自产拍在线观| 国产精品永久免费视频| 国产精品h在线观看| 日韩在线观看网站| 国产精品久久网| 国产欧美最新羞羞视频在线观看| 久热99视频在线观看| 欧美成人h版在线观看| 亚洲精品日韩丝袜精品| 一区二区三区国产视频| 亚洲r级在线观看| 黑人巨大精品欧美一区二区三区| 日韩精品欧美激情| 亚洲综合在线中文字幕| 国产精品欧美在线| 国产精品亚洲第一区| 国产欧美精品在线播放| 欧美激情在线视频二区| 91精品国产91久久久| 欧美寡妇偷汉性猛交|