簡體   English   中英

構造函數中參數和成員變量的用法

[英]Usage of parameter and member variable in constructor

在編寫類的構造函數時,我經常會問自己是否應該使用初始化成員變量或構造函數參數。 這里有兩個例子來說明我的意思:

構造函數參數

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed),
        mEntity(speed)
    { }

private:
    int mSpeed;
    Entity mEntity;
}

成員變量

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed),
        mEntity(mSpeed)
    { }

private:
    int mSpeed;
    Entity mEntity;
}

更進一步 ,在構造函數體中使用變量會產生同樣的問題。

構造函數參數

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed)
    {
        mMonster.setSpeed(speed);
    }

private:
    int mSpeed;
    Monster mMonster;
}

成員變量

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed)
    {
        mMonster.setSpeed(mSpeed);
    }

private:
    int mSpeed;
    Monster mMonster;
}

我知道它並不重要(除了一些特殊情況),這就是為什么我寧願在代碼設計上征求意見,而不是讓它起作用,什么不起作用。

如果您需要一個特定的問題可以使用:什么方式可以產生一個漂亮而一致的代碼設計,並且一個人具有(dis)優勢而不是另一個?

編輯:不要忘記問題的第二部分。 構造函數體中的變量怎么樣?

我將使用構造函數參數,因為在使用該初始化程序時,執行這些初始化程序的順序取決於聲明成員的順序,而不是它們的列出順序。 所以,在這里要小心。

我個人更喜歡使用構造函數參數,以避免使用未初始化的成員變量。

的確,在這個例子中:

class Foo {
private:
    int mEntity;
    int mSpeed;
public:
    Foo(int speed) :
        mSpeed(speed),
        mEntity(mSpeed)
    { }
}

mEntity的初始化將在mSpeed初始化之前發生(因為之前已聲明)。 因此,您將使用未初始化的mSpeed初始化mEntity。

-

在構造函數體本身內部,我也會使用構造函數參數,因為在調試時看到你使用speed來初始化mMonster而不是mSpeed ,它本身是用速度初始化的。 當然這是一個簡約的開銷,但我們可以輕松避免它,我認為這樣做更好。

我會使用構造函數參數。 為什么? 因為這個問題。 construtor參數清晰可讀,您不需要了解很多關於C ++的知識就知道會發生什么。 如果您對C ++知之甚少,並且讓您的團隊中的其他人感到困惑,即使您做得對,那么使用成員也容易出錯。

如果有疑問,請保持簡單。

你絕對應該使用構造函數參數。 如上所述,成員變量將按照它們在頭文件中聲明的順序進行初始化,而不是按照它們在初始化列表中出現的順序進行初始化。

如果訂單不匹配,一些編譯器會發出警告,但使用構造函數參數只會讓您少擔心。 例如,在編輯類接口時以這種方式引入錯誤很容易。 使用成員變量初始化其他成員變量沒有任何好處。

我更喜歡在必須鉗制參數的情況下使用成員變量:

class Foo {
public:
    Foo(int speed) :
        mSpeed((speed < 0 ? 0 : speed)),
        mEntity(mSpeed)
    { }
}

這樣,如果參數無效,它也不會用於導致后續成員無效。

否則我堅持參數變量。

我也會使用構造函數參數。 看簡單示例:

// foo.h

class Foo
{
    std::unique_ptr<int[]> mBuff;
    int mSize;
public:
explicit    Foo(int size);
   // other methods...
};

// foo.c
Foo::Foo(int size)
  : mSize(size) 
  , mBuff( std::make_unique<int[]>(size) ) // here using mSize is wrong, 
            // because, mSize is not initialized yet.
            // here mSize initialized after mBuff, because it's declarated after mBuff member.
{}

因此,如果您使用member而不是constructor參數,則可能很容易創建錯誤情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM