国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

溫故知新----再談構造函數(轉:不轉了)

溫故知新----再談構造函數(轉:不轉了)

更新時間:2022-04-29 文章作者:未知 信息來源:網絡 閱讀次數:

溫故知新

 ----再談構造函數

作者:HolyFire

如果不知道構造函數的請先看一下《由始至終----構造與析構》,看過的我就不再多言,直接轉入話題。

定義一個類的的實例的時候,可以看到這樣的形式

classA a;//構造函數不需要參數

不需要參數的構造函數稱之為缺省構造函數。

不需要參數有兩種情況

1:構造函數沒有參數

2:構造函數有參數但可以不給出

class A{

public:

 A();//構造函數沒有參數

 A( int I = 10 );//構造函數的參數有缺省值,可以不用給出

};

這兩種情況都是缺省構造函數,但是由于缺省構造函數的特殊性(他是被自動調用的),編譯器無法判斷需要調用那一個,所以規定缺省構造函數只能有一個。

缺省構造函數的出現,意味著一個類型可以不依賴約束條件而被創建,就象一些細小的單元,質子,中子和電子,他們的有很大的類似性,不需要用條件來分辨他們被創建的信息。當然不需要用條件來分辨他們被創建的信息也包含了第二種情況,從流水線上生產的統一品種的產品很多都是用同一種方式的,那么創建他們的信息基本一致,也就是所符合第二種情況,參數可以采用缺省值。

這個例子我們可以舉一個例子,我們創建一個指針類的時候,常常把他指向的內容置為空值,這很容易理解,我們需要一個指針,但是現在還不知道指向誰,等到我們要使用它的時候,不一定是知道他是否指向過別的對象,為了簡化問題,一開始就將他置空,但是有時候我們需要用參數在創建的時候就給出指向的對象,特別是在產生臨時對象的時候尤為管用,那么,我們使用一個參數缺省值為空的缺省構造函數。

classA a( a1 );//構造函數有參數,而參數為一個相同的類型

這樣的構造函數叫做拷貝構造函數,意思就是將類一個實例的內容復制到新創建的實例中去,為什么要這么做呢。我們來研究一下。

我們平時使用基本類型的時候,可以使用賦值語句,將相同類型的某個對象的內容賦給另一個對象

int a = 3;

int b;

b = a; //這樣的話,b中就有和a一樣的內容了

還可在允許的情況下使用不同類型的賦值

int a = 3;

long b;

b = a;//這樣的話,b也能包含有和a一樣的內容了

我們在設計類的時候應該也是將一個類作為一個個體,一個類型來處理,而且在現實中這樣的行為也是存在的,一個人的個人資料可以寫在不同的紀錄簿上,一個軟件可以拷貝好幾份。

所以在面向對象編程中,這個問題不容忽視。

回到基本類型上,基本類型的處理編譯器完成了,在C++中很簡單,基本類型占用存儲空間是連續的,所以不管原來的內容是什么,只要照搬照抄就可以了,這種負值方式叫做逐位拷貝,簡稱位拷貝。

int a = 3;

int b;

假設:對象在內存中的存儲順序是先高后低,每個內存單元為1字節(BYTE)=8位(BIT)

//假設這是a(int)的存儲空間

0
3


//假設這是b(int)的存儲空間

?
?


b =a ;

//將a的內容拷貝到b中

0
3


| | | |

?
?


//a

0
3


//b

0
3


我們設計的類在內存中也是連續的,使用這樣的拷貝方法會得到一個一模一樣的同類型實例。而且編譯器我們處理了這一件事(C++的編譯器真好,它能解決的事,就不用麻煩我們了),也就是說即使我們沒有定義拷貝構造函數,編譯器也會在需要使用的時候,自己產生一個拷貝構造函數,使用的方法就是位拷貝。但是這樣好嗎,使用這種方法產生的新類可以安全的工作嗎,應該有不少朋友已經產生了疑問。

什么時候可以讓編譯器自己處理拷貝構造函數。

#include <iostream>

using namespace std;

class A{

private:

int x;

int y;

int z;

public:

A():x(0),y(0),z(0){ }

A( int _x = 0 , int _y = 0 , int _z = 0 ):x(_x),y(_y),z(_z){ }

friend ostream& operator <<( ostream& , A const& );

};

ostream& operator <<( ostream& out , A const& arg )

{

out << "This is a Instance of A" << endl;

out << "Member Data x is : " << arg.x << endl;

out << "Member Data y is : " << arg.y << endl;

out << "Member Data z is : " << arg.z << endl;

return out;

}

void main()

{

A a( 1 , 12 ,123 );

A b(a);

cout << "This is a!" << endl;

cout << a << endl;

cout << "b is a copy of a!" << endl;

cout << b;

}

結果是:

This is a!

This is a Instance of A

Member Data x is : 1

Member Data y is : 12

Member Data z is : 123

b is a copy of a!

This is a Instance of A

Member Data x is : 1

Member Data y is : 12

Member Data z is : 123

可以看出,位拷貝得出的結果是正確的。

上面的例子中成員變量都是在編譯期間決定的,在內存中的位置也相對固定,如果成員變量的內容是在運行期間決定的呢,比如字符串成員變量,他需要在堆中動態分配內存。還能正常工作嗎,繼續看例子。

#include <iostream>

#include <string.h>

#include <mem.h>

using namespace std;

class A{

private:

 char * data;

public:

 A():data(NULL){ }

 A( char * _data ):data(NULL)

{

if( !_data )

 return;

int length = strlen(_data) +1;

data = new char[length];

memcpy( data , _data , length );

}

 ~A()

{

if( data )

 delete data;

}

 void Clear( void )

{

if( data )

 {

 memset( data , 0 , strlen( data ) );

 delete data;

 }

data = NULL;

}



 friend ostream& operator <<( ostream& , A const& );

};

ostream& operator <<( ostream& out , A const& arg )

{

 out << "This is a Instance of A" << endl;

 if( arg.data && *arg.data )

out << "Member Data data is : " << arg.data << endl;

 else

out << "Member Data data is : NULL" << endl;

 return out;

}

void main()

{

 A a( "abcdefg" );

 A b(a);

 cout << "This is a!" << endl;

 cout << a << endl;

 cout << "b is a copy of a!" << endl;

 cout << b << endl;

 a.Clear();

 cout << "Where a's mem clear!" << endl;

 cout << a;

 cout << "God! b's mem clear!" << endl;

 cout << b << endl;

}

結果是:

This is a!

This is a Instance of A

Member Data data is : abcdefg

b is a copy of a!

This is a Instance of A

Member Data data is : abcdefg

Where a's mem clear!

This is a Instance of A

Member Data data is : NULL

God! b's mem clear!

This is a Instance of A

Member Data data is : NULL//不!a中釋放了內存連帶著b的一起釋放掉了。

這是當然的由于位拷貝,b中的data只是將a中的data復制過來了而已,并沒有分配內存,拷貝字符串的內容。顯而易見,使用位拷貝不能滿足我們的要求,原來只需要簡單的將成員變量的值簡單的復制,這種我們稱之為:淺拷貝。現在我們需要處理對應成員變量,用其他方法來得到我們需要的結果,這種我們稱之為:深拷貝。

這樣我們就需要自己寫拷貝構造函數來實現深拷貝了。

#include <iostream.h>

#include <string.h>

#include <mem.h>

class A{

private:

 char * data;

public:

 A():data(NULL){ }

 A( char * _data ):data(NULL)

{

if( !_data )

 return;

int length = strlen(_data) +1;

data = new char[length];

memcpy( data , _data , length );

}

 A( A const& arg )

{

if( !arg.data )

 return;

int length = strlen(arg.data) +1;

data = new char[length];

memcpy( data , arg.data , length );

}

 ~A()

{

if( data )

 delete data;

}

 void Clear( void )

{

if( data )

 {

memset( data , 0 , strlen( data ) );

 delete data;

 }

data = NULL;

}

 friend ostream& operator <<( ostream& , A const& );

};

ostream& operator <<( ostream& out , A const& arg )

{

 out << "This is a Instance of A" << endl;

 if( arg.data && *arg.data )

out << "Member Data data is : " << arg.data << endl;

 else

out << "Member Data data is : NULL" << endl;

 return out;

}

void main()

{

 A a( "abcdefg" );

 A b(a);

 cout << "This is a!" << endl;

 cout << a << endl;

 cout << "b is a copy of a!" << endl;

 cout << b << endl;

 a.Clear();

 cout << "Where a's mem clear!" << endl;

 cout << a;

 cout << "Good! b's mem not clear!" << endl;

 cout << b << endl;

}

結果是:

This is a!

This is a Instance of A

Member Data data is : abcdefg

b is a copy of a!

This is a Instance of A

Member Data data is : abcdefg

Where a's mem clear!

This is a Instance of A

Member Data data is : NULL

Good! b's mem not clear!

This is a Instance of A

Member Data data is : abcdefg //哈哈,這正是我想得到的結果。

如果能使用位拷貝,盡量讓編譯器自己用位拷貝的方式處理,這樣會提高效率。但是一定要謹慎,不然會產生不可預料的結果,如果你的類中有一個成員變量也是類,它使用了深拷貝,那么你也一定要使用深拷貝。

另外,我在《白馬非馬----繼承》中說到,一個類型的的派生類是該類型的一種。那么。

class A;

class B: public A{

};

B b;

A a(b);

這樣的形式是正確的。事實上,b先切片退化成一個臨時變量tempb,類型是class A,有關A的部分原封不動的保留下來,然后使用A a(tempb)這樣的方式成功的調用了。

拷貝構造函數并非可有可無!不能用其他函數來替代

看這樣的例子

void function( A a);

在函數調用的時候按值傳遞參數,那么將在棧里產生一個class A的臨時變量,如果沒有拷貝構造函數,這個過程就無法自動完成,如果沒用設計好淺拷貝或深拷貝,那么可能得不到正確結果。如果拷貝構造函數正確,那么我們可以輕松的獲得我們想要的結果----按值傳遞的參數在函數執行后不受影響。

classA a = a1;//拷貝構造函數

事實上就是這樣的形式。

ClassA a(a1);//可以改成這種形式

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        国产精品久久久久永久免费观看 | 欧美一区二区在线不卡| 激情综合色综合久久综合| 亚洲黄色在线视频| 成人欧美一区二区三区黑人麻豆| 久久久久国产一区二区三区四区| 日韩精品资源二区在线| 91精品国产色综合久久ai换脸| 欧美在线你懂的| 欧美伊人久久久久久午夜久久久久| 北条麻妃国产九九精品视频| 不卡一卡二卡三乱码免费网站| 成人免费高清在线| 99vv1com这只有精品| 一本大道久久a久久精二百 | 中文字幕日韩一区二区| 亚洲国产精品高清| 亚洲欧美偷拍卡通变态| 夜夜嗨av一区二区三区中文字幕| 亚洲欧洲制服丝袜| 五月天欧美精品| 麻豆91在线观看| 国产成人精品亚洲777人妖| www.av精品| 色菇凉天天综合网| 欧美剧在线免费观看网站 | 国产亚洲欧美激情| 国产精品福利一区二区三区| 一区二区三区四区在线播放| 图片区小说区国产精品视频| 极品美女销魂一区二区三区| av一区二区三区四区| 欧美日韩视频一区二区| 欧美成人福利视频| 亚洲日本乱码在线观看| 日韩精品免费专区| 成人激情综合网站| 666欧美在线视频| 国产精品你懂的在线欣赏| 亚洲高清视频的网址| 激情欧美一区二区| 91国产免费观看| 久久综合九色综合欧美亚洲| 亚洲桃色在线一区| 美女爽到高潮91| 高清成人在线观看| 欧美乱妇15p| 国产精品第13页| 日本在线不卡视频一二三区| 成人福利视频在线看| 欧美日韩aaa| 国产三级精品在线| 日本三级亚洲精品| 91精彩视频在线观看| 久久综合色之久久综合| 亚洲日本青草视频在线怡红院| 久久国内精品自在自线400部| 91在线你懂得| 精品国产乱子伦一区| 日韩毛片视频在线看| 日韩电影一二三区| 91丨国产丨九色丨pron| 久久综合九色欧美综合狠狠| 香蕉加勒比综合久久| 97久久久精品综合88久久| 久久亚洲春色中文字幕久久久| 亚洲自拍偷拍九九九| 国产98色在线|日韩| 欧美一区二区视频免费观看| 亚洲精品视频在线看| 成人黄色a**站在线观看| 日韩免费高清av| 午夜精品影院在线观看| 91丨porny丨户外露出| 精品福利在线导航| 理论片日本一区| 欧美一级久久久久久久大片| 亚洲成人动漫在线免费观看| 在线观看国产精品网站| 亚洲三级电影网站| 91蜜桃网址入口| 国产精品激情偷乱一区二区∴| 国产麻豆成人传媒免费观看| 欧美一区二区啪啪| 免费欧美日韩国产三级电影| 欧美日高清视频| 午夜精品久久久| 欧美精三区欧美精三区| 亚洲国产一区二区在线播放| 欧美三级午夜理伦三级中视频| 亚洲激情av在线| 欧美视频三区在线播放| 亚洲国产欧美日韩另类综合| 欧美日韩一区二区三区在线| 亚洲chinese男男1069| 欧美日韩国产a| 免费欧美在线视频| 久久久美女毛片| 成人免费观看视频| 一二三区精品视频| 日韩欧美二区三区| 成人精品免费网站| 亚洲男同1069视频| 欧美日韩国产乱码电影| 男女性色大片免费观看一区二区| 日韩欧美的一区| 成人综合在线观看| 亚洲自拍与偷拍| 日韩欧美国产麻豆| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 日本三级亚洲精品| 久久亚洲欧美国产精品乐播| 成人激情开心网| 一区二区三区在线视频免费 | 91精品在线一区二区| 精品亚洲aⅴ乱码一区二区三区| 久久色中文字幕| 99久久久久久| 日本午夜一本久久久综合| 国产亚洲一区二区在线观看| 日本电影欧美片| 精品一区中文字幕| 伊人夜夜躁av伊人久久| 精品免费一区二区三区| av不卡在线播放| 日韩成人免费电影| 国产精品久久久久久一区二区三区| 欧美色网一区二区| 国产精品白丝jk黑袜喷水| 亚洲综合一二区| 久久免费看少妇高潮| 欧美亚洲高清一区| 成人精品免费视频| 麻豆91精品视频| 亚洲精品乱码久久久久久| 久久免费精品国产久精品久久久久| 色婷婷综合视频在线观看| 国产九色精品成人porny| 亚洲成人一区在线| 国产精品视频九色porn| 日韩三级av在线播放| 99re热视频精品| 国产一区二区精品久久| 五月天久久比比资源色| 亚洲欧美偷拍卡通变态| 国产亚洲欧美日韩俺去了| 91精品国产品国语在线不卡| 色综合天天综合| 国产91精品在线观看| 秋霞成人午夜伦在线观看| 亚洲黄网站在线观看| 中文字幕国产一区二区| 精品国产91久久久久久久妲己 | 一级日本不卡的影视| 国产欧美一区二区三区在线看蜜臀| 91.成人天堂一区| 色婷婷精品大在线视频| 成人一级片网址| 国产资源精品在线观看| 久久se精品一区二区| 蜜臀av性久久久久蜜臀aⅴ | 国产麻豆成人精品| 麻豆精品新av中文字幕| 爽好久久久欧美精品| 亚洲国产精品尤物yw在线观看| 综合av第一页| 亚洲欧洲日产国码二区| 国产精品伦一区二区三级视频| 国产视频一区二区在线观看| 26uuu国产在线精品一区二区| 欧美一级久久久久久久大片| 69成人精品免费视频| 正在播放亚洲一区| 欧美tickling挠脚心丨vk| 精品精品国产高清一毛片一天堂| 日韩免费看网站| 久久人人97超碰com| 日本一区二区免费在线观看视频| 久久精品一区二区三区不卡| 久久久久久久综合日本| 国产精品色哟哟| 综合色中文字幕| 亚洲黄色性网站| 午夜精品久久久久久久久久久| 亚洲超丰满肉感bbw| 日本人妖一区二区| 国产精品影视在线观看| 成人激情小说网站| 欧美性大战xxxxx久久久| 这里是久久伊人| 久久久99精品久久| 亚洲欧洲另类国产综合| 一区二区三区精品视频在线| 奇米影视7777精品一区二区| 国产乱码字幕精品高清av| 成人午夜私人影院| 欧美亚洲国产一区在线观看网站| 欧美精品日日鲁夜夜添| 久久一区二区视频| 亚洲欧美日本在线|