本人C++小白,請見以下代碼和圖片,系統不是自動呼叫解構式嗎,第一段代碼為什么沒有呼叫解構式,而第二段代碼為什么只調了一次解構式啊?
//為什么此段程式沒有呼叫解構式
#include<iostream>
using namespace std;
class CStudent
{
public:
CStudent(int n,int a)
{
num=n;
age=a;
cout<<"construction is running"<<endl;
}
~CStudent() //定義解構式
{
cout<<"distruction is running"<<endl;
}
void display(CStudent s)
{
s.display();
cout<<"I want to fuck you man"<<endl;
}
void display() //對函式多載
{
cout<<"I want to fuck you man"<<endl;
}
private:
int num;
int age;
};
void main()
{
CStudent stu1(1,1),stu2(1,2);
stu1.display(); //此時沒有引數
system("pause");
}

//為什么這段程式只呼叫了一次解構式
#include<iostream>
using namespace std;
class CStudent
{
public:
CStudent(int n,int a)
{
num=n;
age=a;
cout<<"construction is running"<<endl;
}
~CStudent() //定義解構式
{
cout<<"distruction is running"<<endl;
}
void display(CStudent s)
{
s.display();
cout<<"I want to fuck you man"<<endl;
}
void display() //函式多載
{
cout<<"I want to fuck you man"<<endl;
}
private:
int num;
int age;
};
void main()
{
CStudent stu1(1,1),stu2(1,2);
stu1.display(stu2); //此處有引數
system("pause");
}

uj5u.com熱心網友回復:
當物件結束其生命周期時,系統自動呼叫解構式(例如物件所在的函式已呼叫完畢)CStudent stu1(1,1),stu2(1,2); 僅僅是定義了物件stu1和stu2,物件生命周期并沒有結束,所以系統不會自動呼叫解構式。
stu1.display(stu2);物件所在的函式已經呼叫完畢,系統會自動呼叫解構式。
uj5u.com熱心網友回復:
謝謝啦
uj5u.com熱心網友回復:
只有當程式結束時,也就是在main函式結束前的一刻,才會自動呼叫解構式,第二個圖程式因為你手動要求呼叫stu2的解構式了uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
void main(){
CStudent stu1(1,1),stu2(1,2);
stu1.display(stu2); //此處有引數
system("pause");
} //當這個括號結束以后 stu1,stu2才會呼叫解構式,但是在這之前system("pause");已經結束,所以這兩個物件的解構式,你都看不到輸出的
那么控制臺里面輸出的那個解構式是誰的呢??
void display(CStudent s);
你的display函式把物件做為引數,所以傳入的物件,是進行了一次拷貝的,當這個函式結束以后,拷貝的物件會釋放,所以會呼叫解構式,也就是你在控制臺看到的那個解構式輸出了
如果你真的想看到stu1,stu2的析構呼叫,那么你應該這樣:
void fun()
{
CStudent stu1(1,1),stu2(1,2);
stu1.display(stu2);
}
void main()
{
fun();
system("pause");
}
這樣,兩個物件的生命周期,只存在于fun函式內,你就可以看到兩個物件的析構呼叫了
uj5u.com熱心網友回復:
至于為什么第二次呼叫了,是因為呼叫display(CStudent s)的時候,生成了區域物件,當跳出此函式時,會進行銷毀,然后就呼叫了解構式。至于為什么少呼叫了解構式,可能時應為使用了system("pause")的原因,當我在dev上運行時,使用int main(),然后回傳值是0,此時程式回傳了正確的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/11013.html
標籤:基礎類
