代碼如下,運行環境為VS2019,運行結果中劃線部分系統呼叫的建構式是由哪一條陳述句得來的呢?
頭檔案:
class Tdate
{
public:
Tdate(int,int,int); //建構式
Tdate(Tdate &t); //復制建構式
~Tdate();
void print();
private:
int year,month,day;
};
Tdate::Tdate(int a,int b,int c) //建構式的定義
{
year=a;
month=b;
day=c;
cout<<"This is the constructor"<<endl;
}
Tdate::Tdate(Tdate &t) //復制建構式的定義
{
year=t.year;
month=t.month;
day=t.day;
cout<<"This is the copy-constructor"<<endl;
}
Tdate::~Tdate() //解構式的定義
{
cout<<"The year of the destructed object is "<<year<<endl;
}
void Tdate::print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
源檔案:
#include <iostream>
using namespace std;
#include "fuzhigouzaohanshu2.h"
Tdate fun(Tdate Q); //宣告函式fun(),形參為物件,回傳型別為物件
void main()
{
Tdate t1(2010,6,22),t2(2011,7,23); //創建物件t1,t2并初始化,系統自動呼叫建構式
Tdate t3(t1); //利用物件t1初始化新物件t3,系統自動呼叫復制建構式
t2=fun(t3); //通過呼叫函式fun重新賦值物件t2
cout<<"t2物件的資料成員為:";
t2.print();
cout<<"t3物件的資料成員為:";
t3.print();
//程式結束,系統自動呼叫解構式,釋放物件陣列t3,t2,t1記憶體空間
}
Tdate fun(Tdate Q) //形參為區域變數,需要分配記憶體空間,根據形參型別(物件),系統自動呼叫復制建構式
{
cout<<"ok\n";
Tdate t4(2012,1,24); //創建物件t4并初始化,系統自動呼叫建構式
return t4;
//函式呼叫完成,系統自動呼叫解構式,釋放物件t4和形參Q的記憶體空間
}
運行結果:
uj5u.com熱心網友回復:
fun函式回傳后賦值呼叫了復制建構式吧uj5u.com熱心網友回復:
1、第一條線Tdate t3(t1); //利用物件t1初始化新物件t3,系統自動呼叫復制建構式
2、第二條線
return之后相當于執行了一次復制建構式,fun的析構順序為,析構Tdate t4(2012,1,24); 析構Tdate t3(此處Q = t3),然后是析構復制建構式Tdate t4
uj5u.com熱心網友回復:
Tdate t3(t1); 不是對應的第一個復制建構式嗎uj5u.com熱心網友回復:
第一條紅線:問題關鍵在于Tdate fun(Tdate Q) 這個函式。傳參用的型別是Tdata, 所以當實參傳給形參時,相當于執行一次復制建構式。如果形參型別改為Tdata& 就能避免這問題。
第二條紅線:
這條紅線以及之前的兩行所執行的解構式都發生在 Tdata fun(Tdata Q) 內部。函式內部變數占用的是堆疊,也就是LIFO:last in first out。所以形參所占用記憶體會被第一個銷毀(該紅線前兩行),接著銷毀t4(該紅線上一行),最后回傳函式值所占用記憶體被銷毀(該紅線)。
uj5u.com熱心網友回復:
關于第二條紅線問題,前一半寫對了,后面不小心寫錯了,請見諒:正確銷毀順序是 函式回傳值->t4->形參。
uj5u.com熱心網友回復:
如果按照“函式回傳值->t4->形參”的順序,那么它對應的年份不應該是2012->2012->2010嗎?我一直沒搞懂這個uj5u.com熱心網友回復:
你的理解是錯誤的,第二條紅線銷毀的是先區域變數t4,然后形參,因為你的類沒有一個operator=,所以呼叫的默認的你的類里面加一個
Tdate& operator=(const Tdate& rh) {
cout << "enter operator=" << endl;
this->month = rh.month;
this->year = rh.year;
this->day = rh.day;
return *this;
}
你會發現fun結束后依次銷毀了區域變數t4和Q之后,執行了operator= ,然后才銷毀,那個回傳值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20704.html
標籤:C++ 語言
