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

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

c++中拷貝構造函數的參數類型必須是引用

2020-01-26 15:59:26
字體:
來源:轉載
供稿:網友

在C++中, 構造函數,拷貝構造函數,析構函數和賦值函數(賦值運算符重載)是最基本不過的需要掌握的知識。 但是如果我問你“拷貝構造函數的參數為什么必須使用引用類型?”這個問題, 你會怎么回答? 或許你會回答為了減少一次內存拷貝? 很慚愧的是,我的第一感覺也是這么回答。不過還好,我思索一下以后,發現這個答案是不對的。

原因:
如果拷貝構造函數中的參數不是一個引用,即形如CClass(const CClass c_class),那么就相當于采用了傳值的方式(pass-by-value),而傳值的方式會調用該類的拷貝構造函數,從而造成無窮遞歸地調用拷貝構造函數。因此拷貝構造函數的參數必須是一個引用。

需要澄清的是,傳指針其實也是傳值,如果上面的拷貝構造函數寫成CClass(const CClass* c_class),也是不行的。事實上,只有傳引用不是傳值外,其他所有的傳遞方式都是傳值。
先從一個小例子開始:(自己測試一下自己看看這個程序的輸出是什么?)

復制代碼 代碼如下:

#include<iostream>
using namespace std;
class CExample
{
private:
 int m_nTest;
public:
 CExample(int x) : m_nTest(x)      //帶參數構造函數
 {
  cout << "constructor with argument"<<endl;
 }
 // 拷貝構造函數,參數中的const不是嚴格必須的,但引用符號是必須的
 CExample(const CExample & ex)     //拷貝構造函數
 {
  m_nTest = ex.m_nTest;
  cout << "copy constructor"<<endl;
 }
 CExample& operator = (const CExample &ex)   //賦值函數(賦值運算符重載)
 { 
  cout << "assignment operator"<<endl;
  m_nTest = ex.m_nTest;
  return *this;
 }
 void myTestFunc(CExample ex)
 {
 }
};
int main(void)
{
 CExample aaa(2);
 CExample bbb(3);
 bbb = aaa;
 CExample ccc = aaa;
 bbb.myTestFunc(aaa);
 return 0; 
}

果你能一眼看出就是這個結果的話, 恭喜你,可以站起來扭扭屁股,不用再往下看了。
如果你的結果和輸出結果有誤差, 那拜托你謙虛的看完。
第一個輸出: constructor with argument      // CExample aaa(2);
如果你不理解的話, 找個人把你拖出去痛打一頓,然后嘴里還喊著“我是二師兄,我是二師兄.......”
第二個輸出:constructor with argument     // CExample bbb(3);
分析同第一個
第三個輸出: assignment operator                // bbb = aaa;
第四個輸出: copy constructor                      // CExample ccc = aaa;
這兩個得放到一塊說。 肯定會有人問為什么兩個不一致。原因是, bbb對象已經實例化了,不需要構造,此時只是將aaa賦值給bbb,只會調用賦值函數,就這么簡單,還不懂的話,撞墻去! 但是ccc還沒有實例化,因此調用的是拷貝構造函數,構造出ccc,而不是賦值函數,還不懂的話,我撞墻去?。?BR>第五個輸出: copy constructor                      //  bbb.myTestFunc(aaa);
實際上是aaa作為參數傳遞給bbb.myTestFunc(CExample ex), 即CExample ex = aaa;和第四個一致的, 所以還是拷貝構造函數,而不是賦值函數, 如果仍然不懂, 我的頭剛才已經流血了,不要再讓我撞了,你就自己使勁的再裝一次吧。
通過這個例子, 我們來分析一下為什么拷貝構造函數的參數只能使用引用類型。
看第四個輸出: copy constructor                      // CExample ccc = aaa;
構造ccc,實質上是ccc.CExample(aaa); 我們假如拷貝構造函數參數不是引用類型的話, 那么將使得 ccc.CExample(aaa)變成aaa傳值給ccc.CExample(CExample ex),即CExample ex = aaa,因為 ex 沒有被初始化, 所以 CExample ex = aaa 繼續調用拷貝構造函數,接下來的是構造ex,也就是 ex.CExample(aaa),必然又會有aaa傳給CExample(CExample ex), 即 CExample ex = aaa;那么又會觸發拷貝構造函數,就這下永遠的遞歸下去。
所以繞了那么大的彎子,就是想說明拷貝構造函數的參數使用引用類型不是為了減少一次內存拷貝, 而是避免拷貝構造函數無限制的遞歸下去。

附帶說明,在下面幾種情況下會調用拷貝構造函數:
a、顯式或隱式地用同類型的一個對象來初始化另外一個對象。如上例中,用對象c初始化d;
b、作為實參(argument)傳遞給一個函數。如CClass(const CClass c_class)中,就會調用CClass的拷貝構造函數;
c、在函數體內返回一個對象時,也會調用返回值類型的拷貝構造函數;
d、初始化序列容器中的元素時。比如 vector<string> svec(5),string的缺省構造函數和拷貝構造函數都會被調用;
e、用列表的方式初始化數組元素時。string a[] = {string(“hello”), string(“world”)}; 會調用string的拷貝構造函數。

如果在沒有顯式聲明構造函數的情況下,編譯器都會為一個類合成一個缺省的構造函數。如果在一個類中聲明了一個構造函數,那么就會阻止編譯器為該類合成缺省的構造函數。和構造函數不同的是,即便定義了其他構造函數(但沒有定義拷貝構造函數),編譯器總是會為我們合成一個拷貝構造函數。

另外函數的返回值是不是引用也有很大的區別,返回的不是引用的時候,只是一個簡單的對象,此時需要調用拷貝構造函數,否則,如果是引用的話就不需要調用拷貝構造函數。

復制代碼 代碼如下:

#include<iostream>
using namespace std;
class A
{
private:
 int m_nTest;
public:
 A()
 {
 }
 A(const A& other)    //構造函數重載
 {
  m_nTest = other.m_nTest;
  cout << "copy constructor"<<endl; 
 }
 A & operator =(const A& other)
 {
  if(this != &other)
  {
   m_nTest = other.m_nTest;
   cout<<"Copy Assign"<<endl;
  }
  return *this;
 }
};
A fun(A &x)
{
 return x;     //返回的不是引用的時候,需要調用拷貝構造函數
}
int main(void)
{
 A test;
 fun(test);
 system("pause");
 return 0;
}

分享一道筆試題目,編譯運行下圖中的C++代碼,結果是什么?(A)編譯錯誤;(B)編譯成功,運行時程序崩潰;(C)編譯運行正常,輸出10。請選擇正確答案并分析原因。
復制代碼 代碼如下:

class A
{
private:
 int value;
public:
 A(int n)
 {
  value = n;
 }
 A(A other)
 {
  value = other.value;
 }
 void Print()
 {
  cout<<value<<endl;
 }
};
int main(void)
{
 A a = 10;
 A b = a;
 b.Print();
 return 0;
}

答案:編譯錯誤。在復制構造函數中傳入的參數是A的一個實例。由于是傳值,把形參拷貝到實參會調用復制構造函數。因此如果允許復制構造函數傳值,那么會形成永無休止的遞歸并造成棧溢出。因此C++的標準不允許復制構造函數傳值參數,而必須是傳引用或者常量引用。在Visual Studio和GCC中,都將編譯出錯。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩一区二区三区在线免费观看| 91精品国产高清久久久久久| 日韩经典中文字幕在线观看| 国产97色在线| 国产精品视频xxx| 成人www视频在线观看| 日韩经典第一页| 亚洲国产成人91精品| 中文字幕日韩在线视频| 91免费福利视频| 91精品国产高清久久久久久91| 久久久久一本一区二区青青蜜月| 深夜福利国产精品| 亚洲欧美国产精品久久久久久久| 成人免费福利在线| 国产在线观看精品| 国产精品v日韩精品| 欧美黄色片视频| 精品二区三区线观看| 亚洲人成电影在线| 久久免费在线观看| 欧美中文字幕在线观看| 欧美激情一级精品国产| 国产香蕉97碰碰久久人人| 91精品视频观看| 中文字幕精品www乱入免费视频| 夜夜嗨av色综合久久久综合网| 91精品国产色综合久久不卡98口| 91av在线不卡| 亚洲伊人久久大香线蕉av| 国产精品久久久久久久久久新婚| 欧美日韩成人黄色| 欧美特级www| 久久久久久国产精品三级玉女聊斋| 亚洲欧美日韩精品| 亚洲国产精品va在线看黑人| 亚洲精品suv精品一区二区| 中文字幕日韩欧美精品在线观看| 国产精品美女久久久久久免费| 国产不卡视频在线| 97涩涩爰在线观看亚洲| 国产精品久久久久一区二区| 欧洲午夜精品久久久| 久久久极品av| 91久久在线播放| 精品视频9999| 青青草原成人在线视频| 亚洲精品99久久久久| 欧美精品videosex牲欧美| 日韩免费看的电影电视剧大全| 91超碰caoporn97人人| 亚洲视频国产视频| 国产精品久久97| 色狠狠久久aa北条麻妃| 九九热视频这里只有精品| 岛国av一区二区三区| 这里只有精品视频| 久久精品亚洲精品| 日韩高清免费在线| 亚洲自拍偷拍色图| 久久久精品久久久久| 77777亚洲午夜久久多人| 欧美国产精品va在线观看| 亚洲男人天堂九九视频| 久久视频国产精品免费视频在线| 精品丝袜一区二区三区| 美女视频久久黄| 国产香蕉一区二区三区在线视频| 性欧美暴力猛交69hd| 在线观看久久av| 欧美一区深夜视频| 97免费中文视频在线观看| 亚洲最大av在线| 国产不卡av在线免费观看| 91理论片午午论夜理片久久| 日韩电视剧在线观看免费网站| 亚洲最大的成人网| 久久精品视频网站| 国产视频精品xxxx| 日韩中文字幕网址| 成人黄色av网站| 亚洲欧美另类在线观看| 成人天堂噜噜噜| 国产成人精品免高潮费视频| 欧美日韩中文字幕| 成人激情春色网| 亚洲精品美女免费| 日日摸夜夜添一区| 91日韩在线视频| 国产午夜精品麻豆| 热re99久久精品国产66热| 欧美裸体男粗大视频在线观看| 午夜欧美大片免费观看| 欧美日韩亚洲91| 亚洲丝袜在线视频| 亚洲精品国偷自产在线99热| 在线视频欧美日韩精品| 国产乱肥老妇国产一区二| 亚洲小视频在线| 亚洲欧洲自拍偷拍| 国产精品黄色影片导航在线观看| 国产精品96久久久久久又黄又硬| 欧美午夜影院在线视频| 韩国v欧美v日本v亚洲| 成人免费淫片视频软件| 韩国欧美亚洲国产| 国产欧美va欧美va香蕉在| 日韩欧美高清在线视频| 久久久99久久精品女同性| 精品久久中文字幕| 91福利视频在线观看| 狠狠躁18三区二区一区| 国产精品丝袜久久久久久高清| 日本不卡免费高清视频| 精品国产网站地址| 久久久久久久91| 久久精品国产亚洲| 欧亚精品中文字幕| 久久99精品久久久久久青青91| 国内免费久久久久久久久久久| 色青青草原桃花久久综合| 亚洲精品国产精品久久清纯直播| 欧美亚洲另类激情另类| 欧美黄色片视频| 国产成人jvid在线播放| 国产精品91一区| 最近2019年手机中文字幕| 亚洲欧洲xxxx| 日韩亚洲欧美中文在线| 综合欧美国产视频二区| 精品久久久久国产| 久久视频免费观看| www国产精品com| 久久夜精品香蕉| 亚洲iv一区二区三区| 日韩欧美成人免费视频| 亚洲第一区第二区| 日韩成人av一区| 亚洲午夜色婷婷在线| 国产成+人+综合+亚洲欧洲| 国产美女主播一区| 成人国产精品免费视频| 国产精品夜色7777狼人| 亚洲欧美制服丝袜| 国产精品视频播放| 亚洲色图综合网| 欧美成人午夜影院| 国产精品视频网址| 日韩av电影院| 国产中文字幕亚洲| 精品久久久久久久中文字幕| 91免费版网站入口| 日韩在线观看免费全集电视剧网站| 国产偷亚洲偷欧美偷精品| 久久国产天堂福利天堂| 精品久久久久久中文字幕一区奶水| 久久精品中文字幕免费mv| 亚洲国产欧美一区二区三区同亚洲| 欧美激情中文网| 久久久久久成人| 欧美性极品少妇精品网站| 国产精品美女无圣光视频| 久久精品国产亚洲7777| 亚洲视频999|