Q:對象中成員變量的初始值是多少?
創(chuàng)新互聯(lián)是專業(yè)的新化網(wǎng)站建設(shè)公司,新化接單;提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行新化網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
#include
using namespace std;
class Test
{
private:
int i;
int j;
public:
int getI()
{
return i;
}
int getJ()
{
return j;
}
};
int main()
{
Test t1;
cout<<"t1.getI()="<
輸出的結(jié)果為
#include
using namespace std;
class Test
{
private:
int i;
int j;
public:
int getI()
{
return i;
}
int getJ()
{
return j;
}
};
Test gt;
int main()
{
cout<<"gt.getI()="<getI()="<getI()<getJ()="<getJ()<
結(jié)果如圖
小結(jié)
從程序設(shè)計(jì)的角度,對象只是變量
1.在棧上創(chuàng)建對象時(shí),成員變量初始為隨機(jī)值
2.在堆上創(chuàng)建對象時(shí),成員變量初始值為隨機(jī)值
3.在靜態(tài)區(qū)創(chuàng)建對象時(shí),成員變量初始值為0值
解決方案:
1.在類中提供一個(gè)public的intialize函數(shù)
2.對象創(chuàng)建后立即調(diào)用intialize函數(shù)進(jìn)行初始化
示例
#include
using namespace std;
class Test
{
private:
int i;
int j;
public:
int getI()
{
return i;
}
int getJ()
{
return j;
}
void initialize()
{
i = 1;
j = 2;
}
};
Test gt;
int main()
{
gt.initialize();
cout<<"gt.getI()="<initialize();
cout<<"pt->getI()="<getI()<getJ()="<getJ()<
運(yùn)行結(jié)果
Q:當(dāng)intialize的位置出現(xiàn)了改變的話,還會(huì)對其進(jìn)行初始化嗎
輸出結(jié)果如圖所示,發(fā)現(xiàn)intialize位置改變了之后,初始化也出現(xiàn)了問題
存在的問題
1.intialize只是一個(gè)普通函數(shù),必須顯示調(diào)用
2.如果為調(diào)用intialize函數(shù),運(yùn)行結(jié)果是不確定的
解決方法
C++中可以定義與類名相同的特殊成員函數(shù)--這種特殊的成員函數(shù)叫做構(gòu)造函數(shù)
1.構(gòu)造函數(shù)沒有任何返回類型的聲明
2.構(gòu)造函數(shù)在對象定義時(shí)自動(dòng)被調(diào)用
示例
#include
using namespace std;
class Test
{
private:
int i;
int j;
public:
int getI()
{
return i;
}
int getJ()
{
return j;
}
Test()
{
printf("Test() Begin\n");
i = 1;
j = 2;
printf("Test() End\n");
}
};
Test gt;
int main()
{
cout<<"gt.getI()="<getI()="<getI()<getJ()="<getJ()<
運(yùn)行結(jié)果
小結(jié)
1.每個(gè)對象在使用之前都應(yīng)該初始化
2.類的構(gòu)造函數(shù)用于對象的初始化
3.構(gòu)造函數(shù)與類同名并且沒有返回值
4.構(gòu)造函數(shù)在對象定義時(shí)自動(dòng)被調(diào)用
帶有參數(shù)的構(gòu)造函數(shù)
1.構(gòu)造函數(shù)可以根據(jù)需要定義參數(shù)
2.一個(gè)類中可以存在多個(gè)重載的構(gòu)造函數(shù)
3.構(gòu)造函數(shù)的重載遵循C++重載的規(guī)則
對象定義和對象聲明不同
1.對象定義--申請對象的空間并調(diào)用構(gòu)造函數(shù)
2.對象聲明--告訴編譯器存在這樣一個(gè)對象
示例
#include
using namespace std;
class Test
{
public:
Test()
{
cout<<"Test()"<
結(jié)果
小結(jié)
1.構(gòu)造函數(shù)可以根據(jù)需要定義參數(shù)
2.構(gòu)造函數(shù)之間可以存在重載關(guān)系
3.構(gòu)造函數(shù)遵循C++中重載函數(shù)的規(guī)則
4.對象定義時(shí)會(huì)觸發(fā)構(gòu)造函數(shù)的調(diào)用
5.在一些情況下可以手動(dòng)調(diào)用構(gòu)造函數(shù)
1.無參構(gòu)造函數(shù)--沒有參數(shù)的構(gòu)造函數(shù),當(dāng)類中沒有定義構(gòu)造函數(shù)時(shí),編譯器默認(rèn)提供一個(gè)無參構(gòu)造函數(shù),并且其函數(shù)體為空
2.拷貝構(gòu)造函數(shù)--參數(shù)為const class_name&的構(gòu)造函數(shù),當(dāng)類中沒有定義拷貝構(gòu)造函數(shù)時(shí),編譯器默認(rèn)提供一個(gè)拷貝構(gòu)造函數(shù),簡單的進(jìn)行成員變量的值的復(fù)制
拷貝構(gòu)造函數(shù)的意義
1.兼容C語言的初始化方式
2.初始化行為能夠符合預(yù)期的邏輯
3.淺拷貝--拷貝后的物理狀態(tài)相同
4.深拷貝--拷貝后的邏輯狀態(tài)相同
小結(jié)
1.C++編譯器會(huì)默認(rèn)提供構(gòu)造函數(shù)
2.無參構(gòu)造函數(shù)用于定義對象的默認(rèn)初始狀態(tài)‘
3.拷貝構(gòu)造函數(shù)在創(chuàng)建對象時(shí)拷貝對象的狀態(tài)
4.對象的拷貝由淺拷貝和深拷貝兩種方式