2010/03/31

[C++] implicit constructor

如果我們在定義class時沒有明確的給定constructor與destructor時,就會compiler就會自動幫你定義一個沒有功能的constructor與destructor。比如下面的例子:

Ex1

class Base
{
public:
    // 沒有定義constructor,則有一個implicitly constructor叫做: Base(){}
};

class Derived: public Base
{
public:

// Derived的constructor沒有呼叫其parent的constructor ,但compiler會implicitly的呼叫Base(){}。而由於Base(){} 也已經被compiler implicitly的定義了,所以沒問題。

    Derived(int y)    {     }
};

 

但是如果我們已經明確地定義建構子(explicit constructor),則compiler就不會再次定義沒有功能的implicit constructor。比如下例:class Base已經有一個explicit constructor叫做 Base(int x) ,那麼沒有參數的constructor Base() 就不會被隱含地(implicitly )被宣告了。

Ex2

class Base
{
public:
    Base(int x)    { // 已經有explicit constructor,則不會有implicit constructor
    }
};

class Derived: public Base
{
public:

// 如果child class的constructor 沒有explicit 的呼叫parent的constructor,則compiler則會implicitly去呼叫其parent的implicit constructor,也就是沒有參數的constructor Base()。但是這個情況,Base()不會被宣告,所以會出現:「'Base' : 沒有適當的預設建構函式」的錯誤。

    Derived(int y)    { 
    }
};

 

解決方法之一:在child class的constructor去explicitly地呼叫parent已經定義好的constructor。

Ex3

class Base
{
public:
    Base(int x)    { // 已經有explicit constructor,則不會有implicit constructor
    }
};

class Derived: public Base
{
public:

    Derived(int y): Base(y)   { 
    }
};

 

解決方法之二:我們可以在parent class裡面explicitly去宣告一個沒有參數的constructor。

Ex4

class Base
{
public:

    Base(int x)    { // 已經有explicit constructor,則不會有implicit constructor
    }

    Base(){ }      // 因此我們主動宣告一個沒有參數的constructor

};

class Derived: public Base
{
public:

    Derived(int y):  {  // 這時候child 的constructor去implicitly的呼叫Base()就不會有錯誤了。
    }
};

沒有留言:

2024年React state management趨勢

輕量化 在過去Redux 是 React 狀態管理的首選函式庫。 Redux 提供了強大的功能和靈活性,但也帶來了一定的學習成本和複雜度。 隨著 React 生態的不斷發展,越來越多的開發者開始追求輕量化的狀態管理函式庫。 Zustand 和 Recoil 等庫以其簡單易用、性...