C++編譯器何時提供預設的建構函式和拷貝建構函式

來源:互聯網
上載者:User

注意:預設建構函式並不是一定會產生的
如:
class A
{
public:
int f() const {}
};

class B : public A
{
public:
int f() {}
};

A和B都沒有產生預設建構函式,直接導致
const A a;
const B b;
出現如下錯誤:
uninitialized const `a'
uninitialized const `b'

總的來說,編譯器只在它需要的時候才會合成一個預設建構函式,或者擴張所有已存在的建構函式。

一個類滿足下列其中任何一個條件:
1.包含了一個類的對象,這個對象有一個建構函式(包括編譯器合成的預設建構函式)
(在class A中增加一個string str即可)
2.如果繼承自一些基類,其中某些基類有一個建構函式(包括編譯器合成的預設建構函式)
(在class A中增加一個建構函式,B中就會自動產生預設建構函式)
3.有一個虛函數,或者繼承到了虛函數
4.有虛基類

關於合適會產生預設建構函式,請看下面的說明:

如果這個類沒有預設的建構函式,編譯器就會合成一個預設的建構函式,分別做以下事情
如果這個類有建構函式,編譯器就會擴張所有建構函式,做以下事情
1.調用這個對象的建構函式
2.調用基類的建構函式
3.設定正確的虛函數表指標
4.設定指向虛基類對象的指標

如果一個類不滿足上面的4個條件,並且沒有提供建構函式,編譯器也不會為這個類提供預設的拷貝建構函式。

拷貝建構函式類似,對於1,2,判斷是否有拷貝建構函式,並調用拷貝建構函式,3,4相同。
但有一點截然不同,即使一個類不滿足以上4個條件,並且類沒有提供拷貝建構函式,編譯器也會合成一個預設的拷貝建構函式,它用位元組拷貝的方式拷貝對象。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.