您好,登錄后才能下訂單哦!
在什么情況下系統(tǒng)會(huì)自動(dòng)生成缺省(默認(rèn))的構(gòu)造函數(shù)?
1、在類里面有一個(gè)類類型的對(duì)象,這個(gè)類有自己的缺省構(gòu)造函數(shù)(有缺省的參數(shù),參數(shù)有缺省值)。
class B
{
B(int data)
{ }
};不能合成
class B
{
B(int data=0)
{ }
};會(huì)合成
class B
{
public:
B(int data=0)
{ }
};
class C:public B
{
public:
C()
:B(0)
{ }
B b; //編譯器會(huì)自動(dòng)合成
};
2、類是虛擬繼承
class B
{
public:
B()
{}
};
class D:virtual public B
{
public:
D()
{ }
B b;
};
3、基類有缺省構(gòu)造函數(shù),子類沒(méi)有顯示定義自己的構(gòu)造函數(shù)
class B
{
public:
B(int data=0)
{}
};
class D: public B
{
public:
};
4、有虛函數(shù)的類,系統(tǒng)自動(dòng)生成缺省的構(gòu)造函數(shù)來(lái)初始化虛指針
class B
{
public:
virtual void fun()
{
cout << "fun" << endl;
}
};
前面是一些構(gòu)造函數(shù)方面的總結(jié),菜鳥(niǎo)一個(gè)寫的太爛,進(jìn)來(lái)的先湊合著看,會(huì)不定時(shí)補(bǔ)充,有錯(cuò)誤的地方還請(qǐng)多多指點(diǎn)
****************************************************************************************
虛函數(shù):
class Base
{
public:
virtual void FunTest()
{
cout << "Base::FunTest()" << endl;
}
virtual void FunTest1()
{
cout << "Base::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Base::FunTest2()" << endl;
}
virtual void FunTest3()
{
cout << "Base::FunTest3()" << endl;
}
virtual void FunTest4()
{
cout << "Base::FunTest4()" << endl;
}
};
int main()
{
Base b;
system("pause");
return 0;
}
Base b;
009253E8 lea ecx,[b]
009253EB call Base::Base (0921226h)
有call命令說(shuō)明編譯器有合成缺省構(gòu)造函數(shù)
取b的地址,b指向的那塊空間里存放著另一個(gè)地址,該地址指向的空間存放著虛表地址
虛指針指向虛表
虛表的順序和函數(shù)的聲明順序是一樣的
虛函數(shù)的大小:
***************************計(jì)算大小*********************************
class C
{
public:
char a; //1
static char b; //靜態(tài)成員在靜態(tài)區(qū)域,不在棧區(qū),所以不算
void *p; //指針占4個(gè)字節(jié)
static int *c; //靜態(tài)成員在靜態(tài)區(qū)域,不在棧區(qū),所以不算
virtual void func1()
{}
virtual void func2()
{}
//虛函數(shù)屬于同一類,故只需要一個(gè)這個(gè)指針指向虛函數(shù)表,
//占用4個(gè)字節(jié),就算有N個(gè)虛函數(shù),也是4個(gè)字節(jié)
};
int main()
{
C c;
cout << sizeof(C) << endl; //12
cout << sizeof(c.a) << endl; //1
cout << sizeof(c.b) << endl; //1 類型的大小
cout << sizeof(c.c) << endl; //4 類型的大小
cout << sizeof(c.p) << endl; //4
return 0;
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。