2015-04-12 36 views
1

我知道許多peoplpe使用私有成員變量名稱的前綴或後綴。對於那些不這樣做,但只是使用名稱 - 如果你想有相同名稱的構造函數參數,你如何初始化它們?C++私有成員變量與ctor params同名

+1

你可以後綴一個'_'作爲參數名稱。 –

+1

帶'm_'或's_'的前綴成員(用於靜態) –

+1

您可以使用'this'來消除歧義。 – tux3

回答

3

區分通過簡單地寫他們的兩種方法。語言的規則防止出現問題。

struct Foo 
{ 
    Foo(int x) : x(x) {}; 
    int x; 
}; 

(),只有數據成員是在範圍;裏面,函數參數隱藏成員,就像它在一個正常的函數體:

int x = 2; 
void foo(int x) 
{ 
    // any access to `x` means the argument 
} 

這是該命名數據成員時,我不使用m_前綴樣式(或同等學歷)的原因之一。

3

你剛纔初始化它們在初始化列表:

struct foo 
{ 
    foo(int bar) : bar(bar) {} 
private: 
    int bar; 
}; 

注意,初始化列表是明確初始化在構造函數中成員的唯一途徑。一旦你在構造函數的主體中,成員已經被初始化了。

作爲題外話,C++允許你在聲明的點,在這種情況下,除非在構造否則初始化它被初始化爲該值初始化的成員:

struct foo 
{ 
    foo(int bar) : bar(bar) {} 
    foo() {} // bar initialized to 42 
private: 
    int bar = 42; 
}; 
2

如果使用初始化列表,你可以簡單地使用相同的名稱,編譯器會明白你的意思。

實施例:

Book::Book(std::string title, int year) 
: title(title), year(year) 
{} 
1

最簡單的方法是使用MEM-初始化列表。例如

class A 
{ 
private: 
    int data; 
public: 
    A(int data) : data(data) {} 
}; 

如果你想使用構造函數體內的數據成員則是數據成員和參數

class A 
{ 
private: 
    int data; 
public: 
    A(int data) : data(data) 
    { 
     A::data *= data; 
     this->data *= data; 
    } 
}; 
+0

除現在你的會員有三倍的所需價值。不好。 –

1

該方法正式名稱並不具有很高的價值,考慮的範圍是多麼有限。但應該仍然是能夠立即區分這些項目的「起源」的動機。

它已經成爲我的做法,既

一)前綴我的數據屬性與「M_的名字,

b)用「A_」前綴的方法/函數的參數名稱或'an_',始終致力於語法的正確性。

LMBM::Node::Node(uint8_t a_max) : m_max (a_max) ... 

void* LMBM::Node::threadEntry(void* an_objPtr) ... 

void DV1::processDirent(const std::string& a_dirPath) ... 

void DV1::handleDT_REG (DV::Dirent*  an_ent, 
          const std::string& a_path) ... 

FInfo (const std::string& aPfn, const int64_t& aFileSz) : 
    m_pfn (aPfn), 
    m_fileSz (aFileSz) ... 

目標 - 更容易閱讀

動機 - 代碼寫一次,讀多次

我瞭解的構造函數初始化列表的特殊情況。但我也確信使用前綴(您選擇的)有助於防止在開發和維護期間發生的幾種錯誤。