代碼1
#include <iostream>
using namepspace std;
class Test
{
public:
Test(int a=10):ma(a){cout<<"Test()"<<endl;}
~Test(){cout<<"~Test()"<<endl;}
Test(const Test & t):ma(t.ma){cout<<"Test(const Test & t)"<<endl;}
Test & operator =(const Test & t){
if(this==&t){return *this;}
ma=t.ma;
return *this;
}
private:
int ma;
};
int main(){
Test t1(); //建構式
Test t2(t1);//拷貝構造
Test t3=t1; //拷貝構造
Test(20); //顯示生成一個臨時物件,生存周期,所在陳述句
Test t4=Test(20);//這里并不會先Test(20)創建臨時物件,再用臨時物件拷貝構造Test
//上面會優化直接使用建構式 和 Test t4(20)沒有區別
//C++編譯器對于物件構造的優化,用臨時物件生成新物件的時候,這個臨時物件不會產生
//直接構造新物件就可以了
//賦值函式
t4=t2;
//t4是已經存在的物件
//會生成一個臨時物件,用這個臨時物件給t4賦值,這句話還要做臨時物件析構
t4=Test(30);
//int->Test 的時候,Test有沒有合適的帶整形引數的建構式,顯示的呼叫Test建構式 創建臨時物件
t4=(Test)30;
//int->Test 的時候,Test有沒有合適的帶整形引數的建構式 隱式轉換 創建臨時物件
t4=30;
//創建一個臨時物件,用p指標指向這個臨時物件,但是出了這個陳述句,這個臨時物件就析構了,
//這個指標指向了一個析構的物件了!!不可以.
Test *p =&Test(40);
//Test(50);會創建一個臨時物件,但是指定了一個參考(別名)指向他后,這個臨時物件不會產生
//出了這個陳述句不會析構,這個是可以
const Test &ref=Test(50);
return 0;
}
代碼2
#include <iostream>
using namespace std;
class Test
{
public:
Test(int a=10,int b=20):ma(a),mb(b){cout<<"Test(int,int)"<<endl;}
~Test(){cout<<"~Test()"<<endl;}
Test(const Test & t):ma(t.ma),mb(t.mb){cout<<"Test(const Test & t)"<<endl;}
Test & operator =(const Test & t){
if(this==&t){return *this;}
ma=t.ma;
mb=t.mb;
cout<<"operator="<<endl;
return *this;
}
private:
int ma;
int mb;
};
//程式啟動后,全域變數先構造, 第1個創建
//第12個析構
Test t1(10,20);
int main(){
//Test(int,int) 第3個構造
//第9個析構
Test t2(30,40);
//拷貝構造t3,第4個構造
//第8個析構
Test t3=t2;
//靜態區域變數,在程式運行的時候,記憶體已經分配好,但是沒有初始化
//初始化要等到第一次運行的時候才初始化
//建構式 第5個構造 創建t4,不產生臨時物件,等價static Test t4(40,50)
//第10個析構
static Test t4=Test(40,50);
//建構式 第6個構造,創建臨時物件給t2賦值,出陳述句析構臨時物件
// 第1個析構
t2=Test(1,2);
//建構式 第7個構造,創建臨時物件給t2賦值,出陳述句析構臨時物件
//Test(50,500) 呼叫的是 Test(int a=50,int b=500)的建構式,(Test)(50,500) (50,500)是運算式結果是500,
//然后調Test(int a=500,int b=20默認值) 進行物件構造
//第二個析構
t2=(Test)(50,500);
//隱式構造,建構式Test(60,20) 第8個構造,創建臨時物件給t2賦值,出陳述句析構臨時物件
//第三個析構
t2=60;
//堆上構造物件,建構式Test(60,20) 第9個構造,指標指向堆地址
//第5個析構
Test *p1=new Test(8,9);
//堆上構造2個物件,2次呼叫建構式Test(10,20) 第10個構造,指標指向首元素地址
//第6個析構
Test *p2=new Test[2];
//第11個構造 堆疊上創建臨時物件,Test(80,80),指標指向臨時物件,出作用域后,析構該臨時物件
//第4個析構
Test *p3=&Test(80,80);
//第12個構造 堆疊上創建臨時物件,Test(90,100) 參考指向該臨時物件,參考指向臨時物件后,該物件
//不再是臨時物件,出了這個陳述句不析構
//第7個析構
const Test &p4=Test(90,100);
//呼叫P1指向解構式
delete p1;
//呼叫解構式,析構2個物件
delete[] p2;
return 0;
}
//第2個創建 建構式
//第11個析構
Test t5(200, 250);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538892.html
標籤:C++
上一篇:Android ViewPager2 + Fragment 聯動
下一篇:<二>函式呼叫程序中物件優化
