日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Chap2-构造函数语意学

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Chap2-构造函数语意学 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果一個(gè)類沒有任何constructor,那么會(huì)有一個(gè)default constructor被隱式的聲明出來,一個(gè)implicit default constructor將是一個(gè)trivial(無用的)constructor。但是在某些情況下,implicit default constructor將是一個(gè)nontrivial constructor,下面一一討論:

由編譯器合成nontrivial default constructor的四種情況:

1)帶有default constructor 的 member class object(ps:不包括基本數(shù)據(jù)類型對象):

  • case 1:如果一個(gè)類沒有任何constructors,但它包含一個(gè)member class object,那么這個(gè)類的implicit default constructor 會(huì)去調(diào)用member class object的default constructor。

class A { public:A(){cout<<"Class A Constructor!"<<endl;} };class B { public:A a; // a is a member class object and class A has a default constructor. }; void main() {B b; }

  • case 2:如果一個(gè)類包含constructors(ps:不限定是default constructor),也包含帶default constructor的member class object,但是沒有在constructors中顯示調(diào)用,那么編譯器會(huì)擴(kuò)張已存在的constructors,使其每個(gè)member class object得到初始化。
class A { public:A(){cout<<"Class A Constructor!"<<endl;} }; class B { public:B(int){} // Non-default constructorA a; // a is a member class object and class A has a default constructor. }; void main() {B b(5); }

  • case 3:C++中以member class object 在類中的聲明順序來調(diào)用各個(gè)constructors。
class A { public:A(){cout<<"Class A Constructor!"<<endl;} // Default constructor }; class B { public:B(){cout<<"Class B Constructor!"<<endl;} // Default constructor }; class C { public:A a; // Member class objectB b; // Member class object }; void main() {C c; }

2)帶有default constructor 的 base class:
  • case 1:如果一個(gè)類沒有任何constructors,但它派生自一個(gè)或多個(gè)帶有default constructor 的 base class,那么這個(gè)類的implicit default constructor 會(huì)去調(diào)用base class 的 default constructor(按聲明順序調(diào)用)。
class A { public:A(){cout<<"Class A Constructor!"<<endl;} // Default constructor }; class B : public A{}; void main() { B b; }

  • case 2:如果一個(gè)類包含constructors(ps:不限定是default constructor),且派生自一個(gè)或多個(gè)帶有default constructor 的 base class,但是沒有在constructors中顯示調(diào)用,那么編譯器會(huì)擴(kuò)張已存在的constructors,使其每個(gè)上層base class 的 default constructor 得到調(diào)用(按聲明順序調(diào)用)。
class A { public:A(){cout<<"Class A Constructor!"<<endl;} // Default constructor }; class B : public A { public:B(){} }; void main() { B b; }

3)帶有一個(gè)或多個(gè)virtual functions 的 class:
  • class聲明(或繼承)一個(gè)或多個(gè)virtual functions,那么編譯器會(huì)在constructors(如果沒有,則隱式創(chuàng)建一個(gè)default constructor)中隱式的進(jìn)行一些擴(kuò)張行動(dòng):創(chuàng)建一個(gè)virtual function table,內(nèi)放class 的 virtual functions的地址(所以一個(gè)類中如果聲明了virtual function(純虛函數(shù)除外),就必須實(shí)現(xiàn)它,實(shí)現(xiàn)了才會(huì)有函數(shù)地址);在每一個(gè)class object中,創(chuàng)建一個(gè)額外的vft_ptr,內(nèi)含virtual function table的地址。
// sizeof(A)=1 class A { public:A(){cout<<"Class A Constructor!"<<endl;} // Default constructor };// sizeof(A)=4 class A { public:A(){cout<<"Class A Constructor!"<<endl;} // Default constructorvirtual void foo(){} };
4)帶有一個(gè)或多個(gè)virtual base class 的 class:
  • class或繼承一個(gè)或多個(gè)virtual base class,那么編譯器會(huì)在constructors(如果沒有,則隱式創(chuàng)建一個(gè)default constructor)中隱式的進(jìn)行一些擴(kuò)張行動(dòng):創(chuàng)建一個(gè)virtual base class table,內(nèi)放virtual base class subobjects 的地址(所以要virtual派生自一個(gè)base class,那么這個(gè)base class必須提供default constructor,使得編譯器能創(chuàng)建virtual base class 的 subobject);在每一個(gè)class object中,創(chuàng)建一個(gè)額外的vbt_ptr,內(nèi)含virtual base class table的地址。
// sizeof(B)=1 class A{}; class B : public A{}; // sizeof(B)=4 class A{}; class B : public virtual A{};
總結(jié):以上四種情況,會(huì)造成編譯器為未聲明constructor的類隱式生成一個(gè)default constructor,或者擴(kuò)張已有的constructors使其滿足編譯器的需要。

轉(zhuǎn)載于:https://www.cnblogs.com/newhand-liu/archive/2012/05/26/2793274.html

總結(jié)

以上是生活随笔為你收集整理的Chap2-构造函数语意学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。