您好,登錄后才能下訂單哦!
在什么情況下系統會自動生成缺省(默認)的構造函數?
1、在類里面有一個類類型的對象,這個類有自己的缺省構造函數(有缺省的參數,參數有缺省值)。
class B
{
B(int data)
{ }
};不能合成
class B
{
B(int data=0)
{ }
};會合成
class B
{
public:
B(int data=0)
{ }
};
class C:public B
{
public:
C()
:B(0)
{ }
B b; //編譯器會自動合成
};
2、類是虛擬繼承
class B
{
public:
B()
{}
};
class D:virtual public B
{
public:
D()
{ }
B b;
};
3、基類有缺省構造函數,子類沒有顯示定義自己的構造函數
class B
{
public:
B(int data=0)
{}
};
class D: public B
{
public:
};
4、有虛函數的類,系統自動生成缺省的構造函數來初始化虛指針
class B
{
public:
virtual void fun()
{
cout << "fun" << endl;
}
};
前面是一些構造函數方面的總結,菜鳥一個寫的太爛,進來的先湊合著看,會不定時補充,有錯誤的地方還請多多指點
****************************************************************************************
虛函數:
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命令說明編譯器有合成缺省構造函數
取b的地址,b指向的那塊空間里存放著另一個地址,該地址指向的空間存放著虛表地址
虛指針指向虛表
虛表的順序和函數的聲明順序是一樣的
虛函數的大小:
***************************計算大小*********************************
class C
{
public:
char a; //1
static char b; //靜態成員在靜態區域,不在棧區,所以不算
void *p; //指針占4個字節
static int *c; //靜態成員在靜態區域,不在棧區,所以不算
virtual void func1()
{}
virtual void func2()
{}
//虛函數屬于同一類,故只需要一個這個指針指向虛函數表,
//占用4個字節,就算有N個虛函數,也是4個字節
};
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;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。